有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我不能将@NonNullByDefault与没有null注释约束的继承类混合使用吗?

我在用Eclipse null annotations做实验,结果出错了。我有一个a类(下面的例子),我没有它的来源。我想为一个由@NonNullByDefault注释的类扩展它。这会引发错误,因为@NonNull约束与父类的无约束(继承时可为null)参数不匹配

Eclipse建议添加@Nullable,但这并不能消除错误

我做错什么了吗

A类:

public class A {
   public void SomeMethod(
      String[] a)
   {

   }
}

B类:

@NonNullByDefault
public class B extends A {
   @Override
   public void SomeMethod(
      @Nullable String[] a)
   {

   }
}

我收到的错误是:

Illegal redefinition of parameter a, inherited method from A does not constrain this parameter


共 (1) 个答案

  1. # 1 楼答案

    可以对继承的、不受约束的类使用@NonNullByDefault,但必须对任何被重写方法的方法参数应用显式@Nullable约束。这是因为java的默认无约束行为是允许空值

    这里的混乱是由于@Nullable注释的错误放置造成的。原始问题中的位置表明数组内容不应为空,而不是数组本身

    有一个bug,但它与注释无关;这是Eclipse(从4.6开始)使用Quick Fix功能将注释放置在错误位置的结果,这加强了错误的放置,从而无法纠正错误

    阵列的正确位置为:

    public void SomeMethod(
       String @Nullable[] a)
    {
    
    }