我是JAVA中一些内置数据结构的新手,在使用LinkedList时观察到此代码不会引发错误:
LinkedList<?> list = new LinkedList<Integer>();
任何人都可以解释一下我们如何才能将此作为有效声明?我正在使用Eclipse,它在初始化时不会显示任何错误。但是,在此之后添加元素在这种情况下不起作用。
答案 0 :(得分:4)
在
LinkedList<?> list;
您声明名为list
的{{1}}类型的变量,并提供通配符LinkedList
作为类型参数绑定到?
的类型参数LinkedList
。因此T
的类型为list
。此通配符LinkedList<?>
将捕获某种类型,但该类型将是未知且无法使用的。
这个
?
是实例创建表达式。您正在创建类型为new LinkedList<Integer>();
的实例,同时提供类型为LinkedList
的类型参数,以绑定到Integer
的类型参数LinkedList
。因此,实例创建表达式的类型为T
。
请注意,您将通过LinkedList<Integer>
类型的变量LinkedList
与创建的list
进行互动。因此,无论您使用何种类型参数创建它,现在都可以通过LinkedList<?>
类型的值来查看它。
现在,您可以将类型LinkedList<?>
的值分配给LinkedList<Integer>
类型的变量,因为LinkedList<?>
是LinkedList<?>
的超类型。我们可以详细说明为什么会这样,但规则是here。
至于
LinkedList<Integer>
符号LinkedList<?> list = new LinkedList<>();
表示应推断实例创建表达式的类型参数。 The rules for type inferences are numerous and complex.基本上,由于<>
表示未知类型,我们唯一能确定的是类型参数应该至少为?
,因为这是所有类型的超类型。因此,这成为推断的类型。
答案 1 :(得分:1)
?
作为通用参数基本上意味着&#34;任何类&#34;并且Integer
绝对符合&#34;任何类&#34;,因此没有错误。在初始化期间没有错误,因为在运行时期间不存在泛型,因此一旦代码编译(几乎并不重要),您使用的通用类型无关紧要