[英]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
是任何表达式Double
的Number
的子类型, Double
都会更具体,那么它怎么选择a(Number)
呢?
我在这里想念什么?
注意 :我知道Number
是不可分配给Double
,对于编译器选择另一个而言,这是没有意义的,我只是想看看我在第一个引号中误解了什么。
事实证明,我的误解不是作为报价的一部分,而是关于在松散或严格调用下适用的功能是什么。
更具体地说, 严格/松散的调用上下文允许一组转换
Number
对Number
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.