[英]Passing type variable when instantiating a generic class
有人可以解释一下ArrayList
类的这两个实例之间有什么不同吗?
List<Integer> intList = new ArrayList();
List<Integer> intList = new ArrayList<Integer>();
我知道编译器在将其编译为字节码时擦除了类型变量,即Integer
,上面的例子都完全相同。 我想知道在右侧传递类型变量( Integer
)是否有任何好处,因为它已经在左侧声明了? 就我在网上找到的而言,他们都使用后者,但我看不出有什么理由要在两边宣布两次。
他们是两件不同的事。 左侧是变量的类型。 右侧是您正在创建的对象的类型。 编译器将首先使用您在右侧给出的类型创建对象,然后将引用分配给左侧的变量。
在您的情况下,没有区别,因为ArrayList在所有情况下都具有相同的构造函数。 然而:
ArrayList
类型的对象分配给需要List<Integer>
类型的变量。 在某些情况下,您可能会收到警告,因为类型不明确匹配。 没有type参数的版本会产生警告,因为它可能不是类型安全的。 在你的情况下,这不是一个问题,因为列表是空的,但通常它是。 例如
List<String> stringList = new ArrayList<String>();
stringList.add("foo");
List<Integer> intList = new ArrayList(stringList); // Warning about unchecked conversion
int i = intList.get(0); // Oops, throws a ClassCastException
因此,为了确保类型安全,最好通过在任何地方添加类型参数来消除警告。
你可能想要区别:
List intList = new ArrayList();
List<Integer> intList = new ArrayList<Integer>();
它们在运行时都是相同的。 但编译时间存在很大差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.