繁体   English   中英

在java泛型中键入Witness

[英]Type Witness in java generics

我从Geonicics Trail In Java Documentation中看到了什么Type Witness

BoxDemo.<Integer>addBox(Integer.valueOf(10), listOfIntegerBoxes);

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

BoxDemo.addBox(Integer.valueOf(20), listOfIntegerBoxes);

想了解

  • 这样做的正确方法是什么? 使用Type Witness还是让Java推断?
  • 是否存在绝对需要使用类型见证的情况?
  • 这是Java 5的一个功能还是以后添加的?

一些快速回答您的问题:

这样做的正确方法是什么? 使用Type Witness还是让Java推断?

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


是否存在绝对需要使用类型见证的情况?

是。 当无法从方法的输入参数推断出类型时,需要它。 也许泛型类型仅用于返回值,与参数的类型无关。 然后你只需要指定它。


这是Java 5的一个功能还是以后添加的?

泛型是Java 5的语言特性。 类型推断是Java语言规范(JLS)中指定的编译器功能。 Java 8 JLS中,这个主题有了自己的章节。 每个Java版本都对该功能进行了一些增强。 例如,Java 7引入了钻石运算符。 据我所知,Java 5中已经引入了类型见证方法。

是否存在绝对需要使用类型见证的情况?

这是Java 5的一个功能还是以后添加的?

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

引用Generics trail Java文档:

假设您要使用空列表调用方法processStringList。 在Java SE 7中,以下语句不编译:

 processStringList(Collections.emptyList()); 

Java SE 7编译器生成类似于以下内容的错误消息:

 List<Object> cannot be converted to List<String> The compiler requires 

类型参数T的值,因此它以值Object开头。 因此,Collections.emptyList的调用返回List类型的值,该值与方法processStringList不兼容。 因此,在Java SE 7中,您必须指定type参数值的值,如下所示:

 processStringList(Collections.<String>emptyList()); 

Java SE 8中不再需要这样。目标类型的概念已经扩展为包含方法参数,例如方法processStringList的参数。 在这种情况下,processStringList需要一个List类型的参数。 方法Collections.emptyList返回List的值,因此使用List的目标类型,编译器推断类型参数T的值为String。 因此,在Java SE 8中,以下语句编译:

 processStringList(Collections.emptyList()); 

为了完整起见,这是在Java 5中添加的。以下是JLS第三版的相关部分,其中包括Java 5和6:

8.8.7.1显式构造函数调用

ExplicitConstructorInvocation:
    NonWildTypeArgumentsopt this ( ArgumentListopt ) ;
    NonWildTypeArgumentsopt super ( ArgumentListopt ) ;
    Primary. NonWildTypeArgumentsopt super ( ArgumentListopt ) ; 

NonWildTypeArguments:
    < ReferenceTypeList >

ReferenceTypeList: 
    ReferenceType
    ReferenceTypeList , ReferenceType

15.12方法调用表达式

MethodInvocation:
    MethodName ( ArgumentListopt )
    Primary . NonWildTypeArgumentsopt Identifier ( ArgumentListopt )
    super . NonWildTypeArgumentsopt Identifier ( ArgumentListopt )
    ClassName . super . NonWildTypeArgumentsopt Identifier ( ArgumentListopt )
    TypeName . NonWildTypeArguments Identifier ( ArgumentListopt )

请注意,它们称为NonWildTypeArguments 术语“类型见证”未出现在JLS中。 在JLS SE 8中,重写调用规范以使用预先存在的TypeArguments概念; 并且“见证”这个词仍然无处可见。

MethodName已经包含TypeName.Identifier ,因此第五个方法调用定义了Type Witness的显式用法,这就是它未标记为可选的原因。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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