方法重载并选择最具体的类型

NIN*_*OOP 23 java static-methods overloading

示例代码是:

    public class OverloadingTest {

       public static void test(Object obj){
           System.out.println("Object called");
       }

       public static void test(String obj){
           System.out.println("String called");
       }

       public static void main(String[] args){
           test(null);
           System.out.println("10%2==0 is "+(10%2==0));
           test((10%2==0)?null:new Object());
           test((10%2==0)?null:null);
   }
Run Code Online (Sandbox Code Playgroud)

输出是:

名为
10%2 == 0的 字符串为true
称为
String的对象称为

第一次调用test(null)String参数调用方法,这是可以理解的The Java Language Specification.

1)任何人都可以解释我test()在前面的电话中调用的基础吗?

2)当我们提出时,说一个if条件:

    if(10%2==0){
        test(null);
    }
    else
    {
        test(new Object());
    }
Run Code Online (Sandbox Code Playgroud)

它总是使用String参数调用方法.

编译(10%2)时编译器会计算表达式吗?我想知道表达式是在编译时还是在运行时计算的.谢谢.

Hau*_*idt 21

Java使用早期绑定.在编译时选择最具体的方法.通过参数数量和参数类型选择最具体的方法.在这种情况下,参数数量无关紧要.这给我们留下了参数类型.

参数有哪些类型?两个参数都是表达式,使用三元条件运算符.问题简化为:条件三元运算符返回什么类型?类型在编译时计算.

给出了两个表达式:

(10%2==0)? null : new Object(); // A
(10%2==0)? null : null; // B
Run Code Online (Sandbox Code Playgroud)

此处列出了类型评估规则.在B很容易,这两个方面是完全一样的:null将返回(无论何种类型,可能是)(JLS:"如果第二个和第三个操作数具有相同的类型(可能是空型),然后就是类型条件表达式.").在A第二个术语是来自特定的类.由于这是更具体的并且null可以替换类Object的对象,整个表达式的类型是Object(JLS:"如果第二个和第三个操作数之一是null类型而另一个的类型是引用类型,那么条件表达式的类型是引用类型.").

在对表达式进行类型评估之后,方法选择符合预期.

if您给出的示例是不同的:您使用两种不同类型的对象调用方法.三元条件运算符始终在编译时评估为一种类型,适合两个术语.

  • 是的,但这与整个表达式的类型无关。特定的_result_在运行时评估,而term_的_type在编译时评估。当然,result_的_type可以不同,具体取决于所选术语的作用。因此,条件并不重要,因为它不用于_type评估_,仅用于结果评估。 (2认同)