繁体   English   中英

Java最具体的方法子类型化规则

[英]Java most specific method subtyping rules

在Java语言规范的第15.12.2.5节中,他们描述了Java如何从可访问方法和适用方法的列表中选择最具体的方法进行调用。

有一个我不明白的具体说法:

(1)如果S <:T,则对于任何表达式,类型S都比类型T 更具体。

真正困扰我的部分是“任何表情”

为了给为什么,我会引用前一段给定的时两种方法m1 m2 2,我们可以说M 1比米2 更具体与参数表达式E 1,...,E调用,说一个例子k,如果:

m 2不是通用的,并且m 1和m 2可通过严格调用或宽松调用来应用,并且其中m 1具有形式参数类型S 1 ,...,S n和m 2具有形式参数类型T 1 ,... ,T n ,对于所有i(1≤i≤n,n = k),自变量e i的类型S i比T i更具体。

因此,如果对于所有i,类型S i (m 1 )比带有参数表达式e i的 T i (m 2更特定 ,则m 1比m 2 更特定

现在考虑一下:

int a(Number a) { return 1; } // m1
int a(Double a) { return 2; } // m2

由于Double <: Number因此对于任何表达式, Double都比Number更具体(来自引用1)。

我们有:

m 1 :S 1 =>数字

m 2 :T 1 =>两倍

但是,如果我们的自变量参数表达式e 1的类型为Number m 2,则这是最具体的方法,因为Double对于任何表达式(报价1)都是最具体的。

但是,如果我们将Number传递给a()则结果为1即。 未选择采用Double的方法。 但是引号1表示,如果Double是任何表达式DoubleNumber的子类型, Double都会更具体,那么它怎么选择a(Number)呢?

我在这里想念什么?

注意 :我知道Number是不可分配给Double ,对于编译器选择另一个而言,这是没有意义的,我只是想看看我在第一个引号中误解了什么。

事实证明,我的误解不是作为报价的一部分,而是关于在松散严格调用下适用的功能是什么。

更具体地说, 严格/松散的调用上下文允许一组转换

  • 身份转换即 NumberNumber
  • 不断扩大的原始转换,即 byte to short,int,long,float or double
  • 扩大参考转换范围,即 Double Number
  • 拳击转换,即 int to Integer可选),然后进行扩大的引用转换
  • 拆箱转换,即 Integer to int可选的原语转换

在我的示例中,我忽略了这样一个事实,即扩展引用转换无法应用于Number因为Number不是Double的子类型,因此int a(Double a)不被认为是适用的方法。

暂无
暂无

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

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