我有以下代码
public class HelloWorld {
public void printData (Test t) {
System.out.println("Reached 1");
}
public void printData(NewTest t) {
System.out.println("Reached 2");
}
public static void main(String args[]) {
HelloWorld h = new HelloWorld();
h.printData(null);
}
}
我有两个简单的类
class Test {
}
class NewTest extends Test {
}
我得到的输出是达到2
为什么选择第二个函数而不是第一个函数来执行?此外,当我通过制作另一个类NewTest2扩展Test和类似的printData()函数来尝试相同的代码时,它给了我编译时错误。是否有任何规则可以选择必须执行的功能以及何时执行?
为什么选择第二个函数而不是第一个函数来执行?
因为采用NewTest
的方法比采用Test
的方法更具体,并且两者都是可访问和适用的。
然而,当您有Test
的两个子类时,两个转换都不比另一个更具体,因此调用是不明确的。
具体规则见JLS第15.12.2.5节:
如果一个方法调用可访问并适用于多个成员方法,则有必要选择一个成员方法来为运行时方法调度提供描述符。Java编程语言使用的规则是选择最具体的方法。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个更具体。
您使用什么IDE?在Eclipse中,"h.printData(null)"被标记为红色,并出现以下错误:
方法printData(Test)对于类型HelloWorld不明确。
在这种情况下,您需要像这样强制转换null:
"h.printData((测试)null)"