Java の Generics、つまりワイルドカードの使用について質問があります。次のようなクラス GenClass の例があります。
public class GenClass<E> {
private E var;
public void setVar(E x) {
var = x;
}
public E getVar() {
return var;
}
}
私は別の単純なクラスを持っています:
public class ExampleClass {
}
次のテストクラスを作成しました。
public class TestGenClass {
public static void main(String[] str) {
ExampleClass ec = new ExampleClass();
GenClass<ExampleClass> c = new GenClass<ExampleClass>();
c.setVar(ec);
System.out.println(c.getVar()); // OUTPUT: ExampleClass@addbf1
}
}
ここで、ワイルドカードを使用してテスト クラスに次のように記述します。
GenClass<?> c = new GenClass<ExampleClass>();
の場所に:
GenClass<ExampleClass> c = new GenClass<ExampleClass>();
コンパイラはこの新しいステートメントに問題はありませんが、
c.setVar(ec);
「メソッド(setVar())は引数(ExampleClass)には適用されません」と書かれています。このメッセージが表示されるのはなぜですか?
私がワイルドカードを使用した方法では、参照変数 c が GenClass 型になり、パラメーターとして任意のクラスを受け入れるようになると思いました-EI の代わりに任意のクラスがあります。これは単なる変数の宣言です。次に、それを初期化します
new GenClass<ExampleClass>()
これは、タイプ ExampleClass のクラスをパラメータとして持つ、タイプ GenClass のオブジェクトを作成することを意味します。したがって、GenClass の E は ExampleClass になり、メソッド setVar() を使用して、引数として ExampleClass 型の何かを与えることができると思います。これは私の仮定と理解でしたが、Java はそれを好まないようで、正しくありません。どんなコメントでも大歓迎です、ありがとう。