![](/img/trans.png)
[英]Java 8 method reference resolution by signature inference, is this broken?
[英]Java parametric signature resolution
为什么此代码显示2.0而不是1.0?
abstract class B<T extends Number> {
abstract Number f(T j);
}
class A<T extends Number> extends B<T> {
public Number f(Float j) {
return 1f;
}
public Number f(T j) {
return j;
}
}
public class J {
public static void main(String[] args) {
B<Float> a = new A<>();
Number r = a.f(2f);
System.out.println(r);
}
}
你在期待什么 您只有在类B中声明的一种方法:
abstract Number f(T j);
A类中的方法
public Number f(Float j);
不覆盖前者。 它们具有不同的签名。 所以方法
public Number f(T j) {
return j;
}
被叫。
因此,这里问题的核心在于,您已将变量a
声明为B
类型。 由于B
类只有一种方法,那就是获胜的方法。 然而,在你的main
,如果你改变的类型, a
是类型的A
,你会发现它不能编译,因为它是不明确的。 但是,如果您确实将类A
的方法更改为接受原语,并且在main()
方法中将变量a
定义为A
类型,则结果为1.0
。 即,以下将导致打印1.0
:
class A<T extends Number> extends B<T> {
public Number f(float j) {
return 1f;
}
public Number f(T j) {
return j;
}
}
public class J {
public static void main(String[] args) {
A<Float> a = new A<>();
Number r = a.f(2f);
System.out.println(r);
}
}
在下面的代码中
abstract class B<T extends Number> {
abstract Number f(T j);
}
class A<T extends Number> extends B<T> {
public Number f(Float j) //this method does not override the superclass method
{
return 1f;
}
public Number f(T j) {
return j;
}
}
public class J {
public static void main(String[] args) {
B<Float> a = new A<>();
Number r = a.f(2f);
System.out.println(r);
}
}
发生对af(2f)的调用时,它将调用
public Number f(T j)
{
return j;
}
返回j从而提供的输出是2.0
float
与Float
。
自动装箱使它具有相同的感觉 ,但主要区别在于您不能将null
传递给float
参数。
我建议在您的重写方法上使用@Override
批注,这样编译器会告诉您签名是否正确
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.