栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在所有方法调用中允许类型见证人有什么意义?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在所有方法调用中允许类型见证人有什么意义?

从JLS§15.2.12.1开始:

  • 如果方法调用包括显式类型参数,并且成员是泛型方法,则类型参数的数量等于方法的类型参数的数量。

此子句暗示非泛型方法可能潜在地适用于提供显式类型参数的调用。确实,这可能是适用的。在这种情况下,类型参数将被简单地忽略。

其次是理由

该规则源于兼容性和可替代性原则。由于接口或超类的生成可以独立于其子类型,因此我们可以用非泛型方法覆盖泛型方法。但是,重写(非泛型)方法必须适用于对泛型方法的调用,包括显式传递类型实参的调用。否则,该亚型将无法替代其生成的超型。

按照这一推理,让我们构造一个示例。假设在Java 1.4中,JDK有一个类

public class Foo{        public Object check(Object obj){ ... }}

一些用户编写了一个专有类,该类扩展

Foo
并覆盖了
check
方法

public class MyFoo extends Foo{    public Object check(Object obj){ ... }}

当Java 1.5引入泛型时,

Foo.check
泛化为

    public <T> T check(T obj)

雄心勃勃的向后可比性目标要求

MyFoo
仍在Java
1.5中进行编译而无需进行修改。并且
MyFoo.check[Object->Object]
仍然是压倒性的方法
Foo.check[T->T]

现在,根据上述理由,由于可以编译:

    MyFoo myFoo = new MyFoo();    ((Foo)myFoo).<String>check("");

这也必须编译:

    myFoo.<String>check("");

即使

MyFoo.check
不是通用的。


听起来像是舒展。但是,即使我们支持这种观点,解决方案仍然过于广泛和过分。JLS可能已经向上,以便将其拧紧

myFoo.<String,String>check
obj.<Blah>toString()
是非法的,因为类型参数参数数量不匹配。他们可能没有时间解决问题,所以他们只走了一条简单的路线。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/437562.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号