首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协变量返回类型是否根据jls覆盖?

协变量返回类型是否根据jls覆盖?
EN

Stack Overflow用户
提问于 2014-05-12 20:31:28
回答 1查看 106关注 0票数 0

我的问题就是要学着理解jls。我相信jls里的一切都是真的。

考虑jls的下一个片段:

8.4.8.1.重写(通过实例方法) 在类C中声明的实例方法m1覆盖在A类iff中声明的另一个实例方法m2,以下所有内容都是正确的: C是A的一个子类。 m1的签名是m2签名的一个子签名(§8.4.2)。 以下任一项: m2是公共的、受保护的或声明的,在与C相同的包中具有默认访问权限,或 m1重写方法m3 (与m1不同的m3,与m2不同的m3 ),因此m3重写m2。 此外,如果m1不是抽象的,那么m1将实现它覆盖的抽象方法的任何和所有声明。

转到子签名声明:

方法m1的签名是方法m2签名的子签名,条件是: m2具有与m1相同的签名,或 m1的签名与m2签名的擦除(§4.6)相同。

关于同样的签名:

如果两个方法的名称和参数类型相同,则它们具有相同的签名。

哪个规则允许使用协变量返回类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-12 20:36:41

这两个规则都不允许协变量返回类型。方法的签名引用方法名称及其参数的类型和顺序,但不引用返回类型。

来自JLS,第8.4.8.3节

如果返回类型为d1的方法声明R1覆盖或隐藏了具有返回类型R2的另一个方法d2的声明,那么d1必须是d2的返回类型替代(§8.4.5),否则就会发生编译时错误。 此规则允许协变量返回类型--在重写方法时细化其返回类型。

这指的是第8.4.5节,它指出:

返回类型为d1的方法声明R1是返回类型R2的另一个方法d2的返回类型替代,当且仅当以下任何一项都是正确的:

  • 如果R1是无效的,那么R2是无效的。
  • 如果R1是一个基本类型,那么R2与R1是相同的。
  • 如果R1是一个引用类型,那么以下内容之一是真的:
代码语言:javascript
复制
- R1, adapted to the type parameters of d2 (§8.4.4), **is a subtype of R2**.
代码语言:javascript
复制
- R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9).
代码语言:javascript
复制
- d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.

(强调地雷)

第一部分粗体允许协变量返回类型。

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

https://stackoverflow.com/questions/23618298

复制
相关文章

相似问题

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