我使用以下代码
创建了一个泛型类public class MyBean<E> {
}
要创建该类的对象,我可以使用:
MyBean<String> m1 = new MyBean<String>();// valid --------------------statement 1
MyBean<?> m1 = new MyBean<String>(); // valid --------------------statement 2
但是当我尝试使用以下内容创建对象时出现错误:
MyBean<?> m1 = new MyBean<?>();// invalid but why? --------------------statement 3
为什么语句2有效而语句3不有效。 <?>
答案 0 :(得分:4)
MyBean<?>
表示“由特定类型参数化的MyBean,但我不知道哪一个。由于”我不知道哪一个“,它在类型声明中有意义,但不是实例化。你不能创造“某些东西,但我不知道是什么”。
答案 1 :(得分:0)
基本上,“?”意味着未知。在语句二中,你知道/声明(当你初始化)你的集合将保持什么样的元素,即一个字符串。但是在第3个声明中,你什么都不知道......
此链接肯定会有所帮助:
http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html
答案 2 :(得分:0)
MyBean可以作为E使用任何类型。但是,您必须提供该类型。 MyBean将String提供给类型参数E. MyBean根本不提供类型参数,因此这是一个错误。
MyBean是一个MyBean,你不关心它的类型。 MyBean也是一个MyBean,就像String也是一个Object。因此,分配任何MyBean&lt;&gt;到MyBean工作。
答案 3 :(得分:0)
<?>
是泛型的通配符。它通常与extends
或super
或两者一起使用,这意味着泛型应用于,扩展或是另一个对象的父类的方法/类。第3个语句无效,因为您说要使用未知类型实例化MyBean - 在某些时候您需要绑定泛型。这就像尝试使用和接口实例化接口。
如果您想了解有关泛型的更多信息,我认为这本书是一个很好的参考: Java Generics and Collections