2012-10-30 5 views
6

Можно создать дубликат:
Overloaded method selection based on the parameter’s real type
How is an overloaded method choosen when a parameter is the literal null value?Объекта против Метод Строки

Когда я выполняю код ниже, я получаю следующий результат:

Метод с строкой аргумент «...

Почему?

public class StringObjectPOC { 

    public static void test(Object o) { 
     System.out.println("Method with Object argument Called ..."); 
    } 
    public static void test(String str){ 
     System.out.println("Method with String argument Called ..."); 
    } 
    public static void main(String[] args) { 
     StringObjectPOC.test(null); 
    } 
} 
+0

Таким образом, вы перегруженный метод «тест», и вы назвали его со строкой, но вы хотите знать, почему объект не так дозвонились? – JoshRagem

+0

Просто потому, что класс 'String' является специализированной формой класса' Object' (из-за того, что в классе 'String' есть каждая особенность класса' Object' в дополнение к его собственному), который выбирается компилятор, как указано JLS (выбран самый специфический метод, который находится в вашем случае, тот, который принимает параметр типа 'String'). – Lion

+1

Это также аналогичные темы, которые вы можете захотеть ссылаться на [Как перегруженный метод выбирается, когда параметр является буквальным нулевым значением?] (Http://stackoverflow.com/q/13033037/1037210), [Использование null методы перегрузки в Java] (http://stackoverflow.com/q/13041042/1037210) – Lion

ответ

1

Я попытался это:

Test2.class

public class Test2{} 

Test3.class

public class Test3 extends Test2{ 

} 

Испытание.Класс

public class Test{ 

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

public static void print(Test2 obj){ 
    System.out.println("test 2"); 
} 

public static void print(Test3 obj){ 
    System.out.println("Test 3"); 
} 


public static void main(String[]args){ 
    Test.print(null); 
} 

} 

он распечатывается Тест 3

Так же, как в вашем случае, это означает, что если метод перегружен (и когда передается нуль), он признает метод, который имеет ребенок-самый параметр.

Object->Test->Test2 

или в вашем случае:

Object->String 
+0

+1 для * ребенок самый * –

3

null В вызове указаны как теги test(). Вы должны указать null, чтобы убедиться, что он называет тот или иной.

+3

Java также попытается использовать наиболее определенную версию метода, который доступен. Вот почему он выбирает строку, а не объект. – slipperyseal

+0

Я привык к Eclipse, говоря мне, чтобы исправить это, прежде чем я получу шанс написать такой код. – Zagrev

2

Аналогичный пример от Java Puzzles, если я правильно помню.

null может быть String тип или Object тип. Но JVM всегда будет выбирать более точный метод .

В этом случае String является более точных, то Object. (a String - Object, но Object не может быть String).

Это нехорошая привычка писать такой код. Попробуйте указать параметры в соответствии с вашим желаемым методом, например

public class StringObjectPOC { 

    public static void test(Object o) { 
     System.out.println("Method with Object argument Called ..."); 
    } 
    public static void test(String str){ 
     System.out.println("Method with String argument Called ..."); 
    } 
    public static void main(String[] args) { 
     StringObjectPOC.test((Object)null); 
    } 
} 
1

Java пытается найти наиболее подходящий метод, который можно вызвать. String является подклассом объекта, поэтому Java откладывает до метода String всякий раз, когда это возможно. null является вполне приемлемым значением для Object или String, но поскольку String является более специфичным, чем Object, Java отказывается от метода String, потому что это более точно.

0

null это может быть как String и/или Object, но потому, что String наследует от Object, он будет пытаться использовать подпись, которая является более точным. Вы можете бросить null, чтобы выбрать, какой метод для выполнения:

public static void main(String[] args) { 
    Test.test((Object) null); // treats as Object 
    Test.test((String) null); // treats as String 
    Test.test(null);   // treats as String 
} 
Смежные вопросы