ユーティリティ メソッドを Java 8 に導入したいと考えています。名前付きのメソッドmax
は次のように定義されています。
@SafeVarargs
public static final <E extends Comparable<E>> E max(final E... elements) {
E result = null; // error
for(final E e : elements) {
if(result == null || result.compareTo(e) < 0) {
result = e;
}
}
return result;
}
Eclipse にエラーが表示されるようになりました。
Null 型の不一致 (型注釈):
null
は自由型変数と互換性がありませんE
。
@Nullable
の定義に追加するとエラーが取り除かれると思いresult
ましたが、明らかにそうではありません。メソッド全体に追加で注釈を付けても@Nullable
、エラーは解決しません。
ところで、私は FindBugs の jsr-305.jar を使用しており、Eclipse をjavax.annotation.Nonnull
と同様に尊重するように構成しましたjavax.annotation.Nullable
。編集:LubuntuでEclipse Luna 4.4.2とOracle JDK 8ビルド1.8.0_25-b17を実行しています。
さて、私の質問です:エラーはどこから来たのですか?注釈とジェネリック型定義の両方の利点を維持しながら、どうすればそれを取り除くことができますか?
編集:デフォルトのEclipseアノテーションが使用されているサンプルプロジェクトを追加したところ、多少機能しているように見えます(result == null
結果がその時点でのみnullになる可能性があると誤って推測するため、で警告を生成することを除けば)。したがって、これはデフォルト以外の注釈クラスに関する Eclipse の問題のようです。Eclipse の注釈の独自のコピーを使用して再テストしたNullable
ところ、上記と同じエラーが発生しました。