【发布时间】:2009-02-02 16:01:33
【问题描述】:
我有一个关于 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似乎不喜欢它,我也不对。 感谢您的任何评论,谢谢。
【问题讨论】:
-
根据您的用户历史记录,您从未接受过答案。你觉得你现在可以开始了吗?您甚至可以从交易中获得 2 个代表点和一个免费徽章(第一次)。 :D
标签: java generics bounded-wildcard