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