EDIT:ここには大きな違いを見逃してしまったもう一つのしわがあります。このインタフェースとメソッドでJavaジェネリックに何が間違っていますか?
<T extends Bar> T doAnotherThing(List<Foo<T>> foo) {
return foo.get(0).doSomething();
}
だけList
は、ジェネリッククラス/インタフェースであるという事実に注意を払う、それがList
であるという事実を無視してください:doAnotherThing
のメソッドシグネチャではなく、次のです。私はそうのようなメソッドを呼び出しています:
abstract class Bar {
// some neat stuff
}
class BarImpl extends Bar {
// some cool stuff
}
interface Foo<T extends Bar> {
T doSomething();
}
class FooImpl implements Foo<BarImpl> {
BarImpl doSomething() {
// Does something awesome
}
}
これは、すべての罰金とダンディで、素晴らしい作品:
doAnotherThing(new ArrayList<FooImpl>);
だから、私はそうのように定義されたクラスやインタフェースを持っています。
は今、私はそうのような方法があります:
<T extends Bar> T doAnotherThing(List<Foo<T>> foo) {
return foo.get(0).doSomething();
}
この方法は完全に異なるクラスの一般的な方法で、上記チェーンの一部ではありません。私は次のように、このメソッドを使用しようとすると
はしかし、私は型が一致しないというエラーを取得しています:
doAnotherThing(new FooImpl());
FooImpl
はFoo<T>
を実装していたので、私はしないでくださいこれがエラーであるかどうかを確認してください。多分私は何かを誤解しているのだろうか?おかげ
この例では、BarImplはBarを拡張しません。 – AniDev
それは私のために働く。 'BarImpl extends Bar'を忘れたという事実を別にすれば、 – Bozho
あなたはコンパイラエラーメッセージを共有できますか? –