我有一个关于Java中泛型的问题,特别是使用通配符。我有一个示例类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类型,它将接受任何类作为参数 - 在E的位置上,我可以有任何类。这只是变量的声明。然后我用它来初始化。
new GenClass<ExampleClass>()
这意味着我创建了一个类型为GenClass的对象,参数是ExampleClass类型的类。因此,我认为现在GenClass中的E将是ExampleClass,并且我将能够使用setVar()方法,将其参数设置为ExampleClass类型的东西。 这是我的假设和理解,但似乎Java不喜欢它,我是错误的。 您的任何评论都会受到赞赏,谢谢。