7

我从 Eclipse 收到警告,我知道我可以通过抑制警告将其删除,但我更愿意了解是什么让它可能为空。

包信息.java

@ParametersAreNonnullByDefault
package test;

import javax.annotation.ParametersAreNonnullByDefault;

测试.java

package test;


public class Test {
    public static void main( final String[ ] args ) {
        System.out.println( new Test( "a" ).getS( ) );
    }

    private final String s;

    public Test( final String s ) {
        this.s = s;
    }

    public String getS( ) {
        return this.s;//Null type safety: The expression of type String needs unchecked conversion to conform to '@Nonnull String'
    }
}

我不明白为什么我会收到此警告...

PS:

public Test( @Nonnull final String s ) {-> nullness 注释是多余的,具有适用于该位置的默认值

@Nonnull private final String s;-> 没有任何变化

4

1 回答 1

6

问题是 @Nonnull 注释对字段没有影响。它仅支持:

  • 方法参数
  • 方法返回值
  • 局部变量(在代码块内)

见日食文档

很明显 - 由于 Nonnull 没有在字段上检查 - 编译器不知道 Test.s 是 Nonnull 并抱怨它。

显而易见的解决方案确实是在字段访问(或方法上,如果它是一个简单的 getter)上添加一个 @SuppressWarnings("null") :

public String getS() {
    @SuppressWarnings("null")
    @Nonnull String s = this.s;
    return s;
}
于 2012-07-21T23:58:50.463 回答