することができます力:ここ
Container<X> container; public void test() { X x = new X(); new Test().foo(container.get(), x); }
は、コンテナクラスです:いくつかのクラスで class Test {
<T> void foo(A<T> a, T x) {
a.f(x); // now it works!
}
}
パラメタ次の手順を実行して、同じタイプであるとERS:
// 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");
}
}
何これが行うことです:ジェネリック型パラメータT
を定義し、クラスA
のK
タイプのパラメータが一致しなければならないことを強制するためにそれを使用していますfoo
方法x
のタイプ、foo
の第2パラメータです。
<T>
にも制限を課すこともできます。たとえば、<T extends Bar> void foo(A<T> a, T x) {...}
、またはsuper
など、問題に適している場合は制限を課すことができます。 として、X
は実際には型のパラメータではなく、<T extends X> void foo(...)
を使用します。
コードを表示した後は、問題が解決します。
コンテナのメソッド.get()
は、A<? extends K>
のインスタンスを返します。したがって、.get()
から取得するインスタンスの型パラメータは完全には指定されていません。通常、そのような不特定の型を返すのはあまり良い設計ではありません。このようなAPIを改善する方法を示す、効果的なJavaの著者であるJoshua BlochとJavaの多くのAPIと機能については、http://www.youtube.com/watch?v=V1vQf4qyMXg&feature=youtu.be&t=22mを参照してください。ジョシュア・ブロッホは正確には25'36 "で、"ワイルドカード型を戻り値に使用しないでください "と言い、後で説明します。基本的には、それらを使用することによって柔軟性を失うことはありません。 APIのユーザーがそれに対処するのは辛いです(ちょうどその効果を感じました...)。
修正するには、.get()
の署名を変更するだけでコンテナクラス次のようになります。
public class Container<K> {
A<K> get() {
return new A<K>();
}
}
古い署名を使用する理由はありません、get()
はA<K>
のインスタンスを返していることを知っていますので:それは単にあなたが既に知っている情報を失うことになります!
これがまだうまくいかない場合は、問題が他の場所にある可能性があります。さらにコードを表示する必要があります。他の質問もしてください。:)
Xはクラスまたは型パラメータですか? – Joni