使用'参数化LinkedList?'在java中

时间:2014-07-11 00:53:00

标签: java linked-list

我是JAVA中一些内置数据结构的新手,在使用LinkedList时观察到此代码不会引发错误:

LinkedList<?> list = new LinkedList<Integer>();

任何人都可以解释一下我们如何才能将此作为有效声明?我正在使用Eclipse,它在初始化时不会显示任何错误。但是,在此之后添加元素在这种情况下不起作用。

2 个答案:

答案 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;,因此没有错误。在初始化期间没有错误,因为在运行时期间不存在泛型,因此一旦代码编译(几乎并不重要),您使用的通用类型无关紧要