<T extends Foo>
T
のサブタイプでなければならないタイプを定義しFoo
ます。これは実際にはone
またはのどこにも使用されていませんtwo
。
私の推測では、これは、コンパイラが関数の型を消去する方法が、スコープがone.function1()
.
JLS 8.4.8.3を見ると、有効なメソッドのオーバーライドが定義されています。「未チェックの変換」警告について少し下の例があります。そこでは、 「return-type-substitutable」とは何かを説明する8.4.5にリンクし、そこから未チェックの変換について5.1.9にリンクしています。
答えはありませんが、そのメソッドをジェネリック メソッド (パラメーター化された型を使用するメソッドだけでなく) としてタグ付けすることについて何かがトリガーされ、意図的またはバグのために未チェックの変換を実行できるように見えます。
編集:与えられた
public class Main {
class Bar<X> {}
class Foo{}
class one{
public <T extends Foo> Bar<Foo> function1() { return null; }
public Bar<Foo> function2(){ return null; }
}
class two<F extends Foo> extends one{
public Bar<F> function1(){ return null; } //Doesn't throw an error
public Bar<F> function2(){ return null; } //Throws an error
}
}
でコンパイルjavac -Xlint:unchecked Main.java
:
Main.java:9: warning: [unchecked] function1() in Main.two overrides <T>function1() in Main.one
public Bar<F> function1(){ return null; } //Doesn't throw an error
^
return type requires unchecked conversion from Main.Bar<F> to Main.Bar<Main.Foo>
where F,T are type-variables:
F extends Main.Foo declared in class Main.two
T extends Main.Foo declared in method <T>function1()
Main.java:10: error: function2() in Main.two cannot override function2() in Main.one
public Bar<F> function2(){ return null; } //Throws an error
^
return type Main.Bar<F> is not compatible with Main.Bar<Main.Foo>
where F is a type-variable:
F extends Main.Foo declared in class Main.two
1 error
1 warning