首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java泛型中的Witness类型

java泛型中的Witness类型
EN

Stack Overflow用户
提问于 2014-07-24 11:15:17
回答 2查看 4.9K关注 0票数 10

我从Java文档中的Generics中了解了什么是类型见证者

代码语言:javascript
复制
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);

或者,如果省略类型见证,Java编译器会自动推断(从方法的参数)类型参数是Integer:

代码语言:javascript
复制
BoxDemo.addBox(Integer.valueOf(20), listOfIntegerBoxes);

想要理解

  • 怎样才是正确的方法?使用类型见证还是让Java推断?
  • 是否有绝对需要使用类型证人的情况?
  • 这是Java 5的特性还是以后添加的特性?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-24 11:40:23

对你的问题的一些快速回答:

怎样才是正确的方法?使用类型见证还是让Java推断?

由于这两种方法都是有效的,因此在技术上没有正确的答案。但是代码的可读性应该始终是质量标准。所以后者更好。此外,您可能会在以后的开发中更改参数的类型。使用类型推断,您不必更改该行。

是否有绝对需要使用类型证人的情况?

是。当无法从方法的输入参数推断类型时,就需要使用它。可能泛型类型仅用于返回值,与参数类型无关。那么,您只需指定它。

这是Java 5的特性还是以后添加的特性?

泛型是Java 5的一种语言特性。类型推断是Java语言规范(JLS)中指定的编译器特性。在Java 8 JLS中,这个主题有自己的章节。每个Java版本在该特性中都做了一些增强。例如,Java 7引入了菱形操作符。据我所知,Java 5中已经引入了方法的类型见证。

票数 13
EN

Stack Overflow用户

发布于 2015-04-23 11:17:49

是否有绝对需要使用类型证人的情况? 这是Java 5的特性还是以后添加的特性?

下面的示例展示了使用类型见证的强制情况和Java 8中的改进。

引用Generics跟踪Java文档:

假设您希望使用空列表调用方法processStringList。在Java 7中,以下语句不编译: processStringList(Collections.emptyList()); Java 7编译器生成一条类似于以下内容的错误消息: 不能将列表转换为编译器所需的列表 类型参数T的值,因此它从value对象开始。因此,对Collections.emptyList的调用返回类型列表的值,该值与方法processStringList不兼容。因此,在Java 7中,必须指定类型参数的值,如下所示: processStringList(Collections.emptyList()); 这在Java 8中不再是必要的。目标类型的概念已经扩展到包括方法参数,例如方法processStringList的参数。在这种情况下,processStringList需要一个类型List的参数。方法Collections.emptyList返回一个List值,因此使用List的目标类型,编译器将推断类型参数T的值为String。因此,在Java 8中,以下语句编译: processStringList(Collections.emptyList());

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24932177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档