2016-11-14 88 views
1

看,我们知道,在编译泛型类转化为原始形式,所以是否需要澄清java中泛型变量初始化的泛型参数?

List<String> a=new Arraylist<String> 

实际上是相同的

List<String> a=new Arraylist<> 

是吗?是否有任何情况需要在右侧指定菱形内的类型?

+0

这取决于你正在使用的Java版本。在Java 7中,它是可选的。 – ScanQR

回答

0

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

我们知道,在编译泛型类转化为原始形式

基本属实,这就是所谓的类型擦除。

List<String> a=new Arraylist<String> 是有效的 List<String> a=new Arraylist<>

在类型擦除感

不一样的。简单地说,在编译时,List<String> a=new Arraylist<String>,“改变”,以List a=new Arraylist

你带来了这个例子,是在Java 7中的一项新功能,您可以ommit的赋值UND只使用右手边的泛型参数所谓的“钻石操作员”。这是你的陈述成为现实的地方。在Java 7之前,你不能这样做。

+0

好的,如果编译时,列表 a =新Arraylist ,被“改变”为List a = new Arraylist 为什么不能执行 'a.add(new Exception(“dummy”))'? 在删除类型之前检查方法的正确性吗? – SubZr0

+1

@ SubZr0正确。在编译时,泛型类型用于这种检查。在这些检查之后执行类型擦除。 –

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的改进。

2

从Java 7开始,您不需要指定实例化部分的类型。对于返回语句也同样适用。它隐含地从返回类型中获取。

+0

>它隐含地从返回类型中获取。 但它有关系吗?所有可能的类型参数都有一个原始类型,而对象的行为由引用类型设置。为什么需要? – SubZr0

1

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

首先,是的,如果你使用java 1.6或更低,因为钻石操作员不存在。


的Java 7或更高版本,不necesary,但为了更好的可读性类型的注射,必要时(实例,返回类型...)

FROM THIS ARTICLE

减少冗长在其他单词,JDK 7项目硬币添加了一个钻石操作员带来了类型推理的构造函数已经可用的方法。

  • 随着方法的类型推断隐式完成,当一个人离开显式参数类型规范。
  • 另一方面,通过实例化,必须明确指定菱形运算符以“告知”编译器推断该类型。
0

<>称为Diamond Operator。钻石运算符通过让编译器推断泛型类的构造函数的参数类型来减少一些Java周围泛型的冗长度。换句话说,从Java 7开始,没有必要在钻石运算符中指定类型。

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