繁体   English   中英

是否需要在初始化Java中的泛型变量时弄清泛型参数?

[英]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语句也同样适用。 它从返回类型隐式获取。

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

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


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

从这篇文章

换句话说,JDK 7项目币中添加了Diamond运算符, 为方法提供的构造函数带来了类型推断。

  • 使用方法时,如果不使用显式参数类型说明,则将隐式完成类型推断。
  • 另一方面,通过实例化,必须显式指定菱形运算符以“告诉”编译器以推断类型。

<>称为Diamond Operator Diamond运算符通过让编译器为泛型类的构造函数推断参数类型,从而减少了Java泛型周围的冗长程度。 换句话说,由于Java 7,没有必要在菱形运算符内部指定类型。

请参阅: Java 7中Diamond运算符的意义是什么?

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

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM