我有一个关于Java中泛型的问题,即使用通配符.我有一个像这样的示例类GenClass:
public class GenClass{ 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(); GenClassc = new GenClass (); c.setVar(ec); System.out.println(c.getVar()); // OUTPUT: ExampleClass@addbf1 } }
现在,如果我使用通配符并在测试类中写入:
GenClass> c = new GenClass();
在以下的地方:
GenClassc = new GenClass ();
编译器对这个新语句没有任何问题,但它抱怨
c.setVar(ec);
它说"方法(setVar())不适用于参数(ExampleClass)".为什么我收到此消息?
我认为我使用通配符的方式使得引用变量c的类型为GenClass,它将接受任何类作为参数 - 在EI的位置上将具有任何类.这只是变量的声明.然后我用它初始化它
new GenClass()
这意味着我创建了一个GenClass类型的对象,它具有一个类型为ExampleClass的参数.所以,我认为现在GenClass中的E将是ExampleClass,我将能够使用方法setVar(),将其作为类型为ExampleClass的参数.这是我的假设和理解,但似乎Java不喜欢它,我不对.任何评论表示赞赏,谢谢.
Java Generics Tutorial中介绍了这种确切的情况.
请注意,[使用通配符],我们仍然可以从[泛型
Collection
]中读取元素并为其指定类型Object
.这总是安全的,因为无论集合的实际类型如何,它都包含对象.然而,向它添加任意对象是不安全的:
Collection> c = new ArrayList(); c.add(new Object()); // Compile time error
由于我们不知道元素类型
c
代表什么,因此我们无法向其添加对象.该add()
方法接受类型的参数E
,即集合的元素类型.当实际的类型参数是?
,它代表一些未知类型.我们传递给的任何参数add
都必须是这种未知类型的子类型.由于我们不知道它是什么类型,我们无法传递任何内容.唯一的例外是null
,它是每种类型的成员.
(强调我的)