是否需要澄清java中泛型变量初始化的泛型参数?

时间:2016-11-14 09:10:27

标签: java generics

看,我们知道在编译时,泛型类会转换为原始形式,所以

List<String> a=new Arraylist<String>

实际相同
List<String> a=new Arraylist<>

我是对的吗?是否有任何情况需要在右侧指定钻石内的类型?

5 个答案:

答案 0 :(得分:2)

您可能需要查看Oracle's official documentation on the topic

正如您所猜测的那样,Java 7没有必要指定类型,只要它可以通过上下文明显推断。引用最相关的部分:

  

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<>());

编辑:a more comprehensive Oracle tutorial on type inference,最新的Java 8增强功能。

答案 1 :(得分:2)

从Java 7开始,您不需要在实例化部分指定类型。对于退货声明,同样适用。它隐含地来自返回类型。

答案 2 :(得分:1)

  

我是对的吗?是否是否真的需要在右侧指定菱形内的类型

首先,是的,如果您使用java 1.6或更低版本,因为钻石运算符不存在。

Java 7或更高版本,不是必需的,它可以减少冗长,以便在必要时更好的可读性注入类型(实例化,返回类型......)

FROM THIS ARTICLE

  

换句话说,JDK 7项目硬币添加钻石运算符为类型推断带来了方法可用的构造函数。

     
      
  • 使用方法类型推断在忽略显式参数类型规范时隐式完成。
  •   
  • 另一方面,在实例化时,必须明确指定菱形运算符&#34;告诉&#34;编译器推断出类型。
  •   

答案 3 :(得分:0)

<>被称为Diamond Operator。 Diamond运算符通过让编译器推断泛型类的构造函数的参数类型来减少Java对泛型的一些冗长。换句话说,由于Java 7没有必要在菱形运算符内指定类型。

请参阅:What is the point of the diamond operator in Java 7?

答案 4 :(得分:0)

你在这里混合了一些东西。

  

我们知道在编译时,泛型类会转换为原始格式

基本上是真的,它被称为类型擦除。

  

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之前,你不能这样做。