[英]Is it required to clarify generic parameter on initialization of generic variable in java?
看,我们知道在编译时,泛型类已转换为原始形式,因此
List<String> a=new Arraylist<String>
实际上是相同的
List<String> a=new Arraylist<>
我对吗? 是否确实需要在右侧指定菱形内的类型?
您可能需要查看有关该主题的Oracle官方文档 。
正如您所猜测的那样,从Java 7开始,没有必要指定类型,只要它可以由context明显地推断出来即可 。 引用最相关的部分:
Java SE 7支持通用实例创建的有限类型推断。 如果构造函数的参数化类型在上下文中很明显,则只能使用类型推断。 例如,以下示例无法编译:
List<String> list = new ArrayList<>(); list.add("A"); // The following statement should fail since addAll expects // Collection<? extends String> list.addAll(new ArrayList<>());
编辑: 有关类型推断的更全面的Oracle教程 ,最新的Java 8增强功能。
从Java 7开始,您无需在实例化部分指定类型。 对于return语句也同样适用。 它从返回类型隐式获取。
<>
称为Diamond Operator
。 Diamond运算符通过让编译器为泛型类的构造函数推断参数类型,从而减少了Java泛型周围的冗长程度。 换句话说,由于Java 7,没有必要在菱形运算符内部指定类型。
您在这里混合了一些东西。
我们知道在编译时,泛型类会转换为原始形式
基本上是真的,这称为类型擦除。
List<String> a=new Arraylist<String>
对于List<String> a=new Arraylist<>
实际上是相同的
从类型擦除的意义上讲。 简而言之,在编译时,将List<String> a=new Arraylist<String>
更改为List a=new Arraylist
您提出的示例是Java 7的一项新功能。您可以省略赋值右侧的泛型参数,而只需使用所谓的“钻石运算符”即可。 这就是您的陈述正确的地方。 在Java 7之前,您不能执行此操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.