7

日食から警告が表示され、抑制警告で削除できることはわかっていますが、それがnullになる可能性がある理由を理解したいと思います。

パッケージ情報.java

@ParametersAreNonnullByDefault
package test;

import javax.annotation.ParametersAreNonnullByDefault;

test.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 に答える