我从Java文档中的Generics中了解了什么是类型见证者
BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);或者,如果省略类型见证,Java编译器会自动推断(从方法的参数)类型参数是Integer:
BoxDemo.addBox(Integer.valueOf(20), listOfIntegerBoxes);想要理解
发布于 2014-07-24 11:40:23
对你的问题的一些快速回答:
怎样才是正确的方法?使用类型见证还是让Java推断?
由于这两种方法都是有效的,因此在技术上没有正确的答案。但是代码的可读性应该始终是质量标准。所以后者更好。此外,您可能会在以后的开发中更改参数的类型。使用类型推断,您不必更改该行。
是否有绝对需要使用类型证人的情况?
是。当无法从方法的输入参数推断类型时,就需要使用它。可能泛型类型仅用于返回值,与参数类型无关。那么,您只需指定它。
这是Java 5的特性还是以后添加的特性?
泛型是Java 5的一种语言特性。类型推断是Java语言规范(JLS)中指定的编译器特性。在Java 8 JLS中,这个主题有自己的章节。每个Java版本在该特性中都做了一些增强。例如,Java 7引入了菱形操作符。据我所知,Java 5中已经引入了方法的类型见证。
发布于 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());
https://stackoverflow.com/questions/24932177
复制相似问题