当您创建一个采用泛型类型的集合字段时,您可以通过提供它来实现吗?作为价值或根本没有什么区别:
e.g。
List<String> list = new ArrayList<?>();
List<String> list = new ArrayList<>();
List<String> list = new ArrayList<String>();
答案 0 :(得分:4)
第一个陈述是错的;您无法实例化具有未知类型的参数化类。您可能会将其与类似的语法混淆,其中未知在声明的类型中,如此虚拟示例中所示:
public static String getClassName(Class<?> clazz) {
return clazz.getName();
}
在上面的示例中,使用&lt;?&gt;表示可以提供任何类型实例化。
最后两个陈述是等价的;在new ArrayList<>()
中,String
类型参数由编译器从左侧的声明类型推断,而在最后一个语句中,这是明确给出的。正如其他人已经正确指出的那样,这种类型推断仅在Java 7之后可用。在Java 7之前,您可以通过利用在方法调用中推断类型的方式来实现类似的类型推断。例如,Guava的Lists.newArrayList()允许在右侧编写“Lists.newArrayList()”而不指定第二次类型,并且JDK7之前的编译器将从左侧正确推断类型那里。
答案 1 :(得分:1)
您的第二个示例是Java 1.7引入的新功能。空的通用护腕隐含地采用左侧的通用类型。所以基本上它和你上一个例子一样。
另外,你的第一个例子是worng(正如其他人已经说过的那样)。有效将是
List<?> list = new ArrayList<String>();
答案 2 :(得分:1)
List<String> list = new ArrayList<>();
相当于
List<String> list = new ArrayList<String>();
运算符<>
被称为diamond
,并在JDK7中引入
您问题中的第一个陈述无效。
答案 3 :(得分:0)
第一行是wild card,最后两行是java 7引入的短代码,它们是相同的oracle source