次のようにして、パラメータを強制的に同じ型にすることができます。
// the first class, A<K>:
class A<K> {
void f(K x) {}
}
// the second class, defining the method with generic type parameters
class Test {
<T> void foo(A<T> a, T x) {
a.f(x); // now it works!
}
}
// a third class, that uses the above two:
class Main {
public static void main(final String... args) {
final Test test = new Test();
final A<String> a = new A<>();
test.foo(a, "bar");
}
}
これが行うことは次のとおりです。メソッドfoo
はジェネリック型パラメーターを定義し、それを使用して、クラスの型パラメーターが の型、 の 2 番目のパラメーターと一致する必要がT
あることを強制します。K
A
x
foo
、または with<T>
など、必要に応じて、問題に適しているかどうかに制限を課すこともできます。ジョニが質問のコメントで尋ねたように、実際には型パラメーターではなく型である場合、これが必要になります。<T extends Bar> void foo(A<T> a, T x) {...}
super
X
<T extends X> void foo(...)
さらにコードを表示すると、問題が明らかになります。
.get()
コンテナのメソッドは のインスタンスを返しますA<? extends K>
。したがって、取得元のインスタンスの型パラメーターは.get()
完全には指定されていません。通常、このような未指定の型を返すのはあまり良い設計ではありません。このような API を改善する方法を示す、Effective Java および Java の多くの API と機能の作成者である Joshua Bloch によるビデオ プレゼンテーションについては、http://www.youtube.com/watch?v=V1vQf4qyMXg&feature=youtu を確認してください。 be&t=22m . 正確に 25'36" で、Joshua Bloch は「戻り値で [ワイルドカード型] を使用しようとしないでください」と述べており、後で説明しています。基本的に、それらを使用しても柔軟性は得られず、 APIのユーザーがそれに対処するのは非常に困難です(あなたはそれを行うことの効果を感じただけです...)。
修正するには、 の署名を に変更してみてください.get()
。A<K> get()
コンテナ クラスは次のようになります。
public class Container<K> {
A<K> get() {
return new A<K>();
}
}
get()
がのインスタンスを返すことはわかっているのでA<K>
、古い署名を使用する理由はありません。単に知っている情報を失うだけです!
それでも問題が解決しない場合は、問題が別の場所にある可能性があり、さらに多くのコードを表示する必要があります... または、さらに良いことに、他の質問をしてください! :)