2017-07-02 201 views
-1

如果我有「重複」這個簽名的方法:Java找到一個有效的方法有多少轉換?

repeated(byte a); 
repeated(int a); 
repeated(long a); 
repeated(double a); 
repeated(Integer a); 
repeated(Object a); 
//repeated(long a); 
//repeated(Long... a); 

並執行此:repeated(1);

嘗試最多多少讓Java去越遠有效類型(對象在這種情況下) 。看起來像必要的時間,但爲什麼不工作在只有註釋方法的類上?因爲我嘗試了一些方法,並在必要時調用幾乎所有的方法。

+1

很抱歉,但它不是真正清楚你」在這裏再問一次。 –

+2

它直接用於重複(int),因爲int文字的類型是int,所以它完全匹配。 –

+0

我想了解Java如何選擇方法以及如果需要轉換類型的次數。像int - > Integer - > Integer ... - > Object? – Genaut

回答

0

Java中的所有內容都是強類型的,因此它知道在編譯時使用哪一個。它最少選擇最具體的類型,所以如果有特定的匹配,它會在查看其他重載之前首先進行。

下面是一些例子:

// Picks int over Integer to avoid autoboxing 
repeated((int)5); → repeated(int a); 

// Does not match `Object` (even though Integer is an Object) because there's a more specific overload (Integer) available 
repeated(new Integer(5)); → repeated(Integer a); 

// Matches `Object` because there's no more specific overload 
repeated(new String("5")); → repeated(Object a); 
+0

你不必顯式將5轉換爲int。 – matoni

1

的Java 並不需要猜測調用哪個方法。它已經知道在編譯時要調用的方法,它是由在傳遞的參數的類型決定

運行這一點,看看會發生:

public static void main(String[] args) { 
    repeated((byte) 1);  // casting int 1 to byte, so repeated(byte) is invoked 
    repeated(1);    // 1 is int, so repeated(int) is invoked 
    repeated((int) 1.0);  // casting double 1.0 to int, so repeated(int) is invoked 
    repeated((int) 1L);  // casting long 1 to int, so repeated(int) is invoked 
    repeated(1L);    // 1L is long number, so repeated(long) is invoked 
    repeated((long) 1);  // casting int 1 to long, so repeated(long) is invoked 
    repeated((long) 1.0);  // casting double 1.0 to long, so repeated(long) is invoked 
    repeated(1.0);   // 1.0 is double so repeated(double) is invoked 
    repeated((double) 1);  // casting int 1 to double, so repeated(double) is invoked 
    repeated((double) 1L); // casting long 1 to double, so repeated(double) is invoked 
    repeated(new Integer(1)); // new Integer(1) is Integer so repeated(Integer) is invoked 
    repeated((Integer) 1); // casting int 1 to Integer, so repeated(Integer) is invoked 
           // conversion from int to Integer and vice-versa are natively supported 
    repeated(new Object()); // new Object() is Object, so repeated(Object) is invoked 
    repeated((Object) new Integer(1)); // casting Integer to Object, so repeated(Object) is invoked 
             // upcasting to supertype (Integer extends Object) 
} 

public static void repeated(byte a) {System.out.println("repeated(byte)");} 
public static void repeated(int a) {System.out.println("repeated(int)");} 
public static void repeated(long a) {System.out.println("repeated(long)");} 
public static void repeated(double a) {System.out.println("repeated(double)");} 
public static void repeated(Integer a) {System.out.println("repeated(Integer)");} 
public static void repeated(Object a) {System.out.println("repeated(Object)");} 
相關問題