看,我们知道在编译时,泛型类会转换为原始形式,所以
List<String> a=new Arraylist<String>
与
实际相同List<String> a=new Arraylist<>
我是对的吗?是否有任何情况需要在右侧指定钻石内的类型?
答案 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或更高版本,不是必需的,它可以减少冗长,以便在必要时更好的可读性注入类型(实例化,返回类型......)
换句话说,JDK 7项目硬币添加钻石运算符为类型推断带来了方法可用的构造函数。
- 使用方法类型推断在忽略显式参数类型规范时隐式完成。
- 另一方面,在实例化时,必须明确指定菱形运算符&#34;告诉&#34;编译器推断出类型。
答案 3 :(得分:0)
<>
被称为Diamond Operator
。 Diamond运算符通过让编译器推断泛型类的构造函数的参数类型来减少Java对泛型的一些冗长。换句话说,由于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之前,你不能这样做。