9

なぜ次のことが起こるのですか?

public class one{
   public <T extends Foo> Bar<Foo> function1() {}
   public Bar<Foo> function2(){}
}
public class two<F extends Foo> extends one{
   public Bar<F> function1(){} //Doesn't throw an error
   public Bar<F> function2(){} //Throws an error
}

<T extends Foo>Foo はスーパータイプでオーバーライドできるということですか?

注:私の質問はなぜエラーがスローされるのかではありませんfunction2()...しかし、なぜエラーがスローされないのですか。function1()

4

3 に答える 3

2

<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
于 2013-09-05T20:08:19.050 に答える