2010-04-09 2 views
16
package org.study.algos; 
public class Study { 

    public static void main(String[] args) { 
     A a = new A(); 
     a.m1(null); 
    } 
} 
class A { 
    public void m1(String s) { 
     System.out.println("String"); 
     System.out.println(s); 
    } 
    public void m1(Object obj) { 
     System.out.println("Object"); 
     System.out.println(obj); 
    } 
} 

Здесь выходКак неоднозначно выбирая из перегруженных методов, разрешенных на Java?

Строка нуля

Почему JVM решить этот метод к одному с строковым аргументом?

Заранее спасибо J

+0

Возможный дубликат HTTP: // StackOverflow.com/questions/1545501/which-overload-will-get-selected-for-null-in-java – polygenelubricants

ответ

15

Это довольно сложный алгоритм, детально в JLS 15.12. Но здесь важна роль 15.12.2, в которой говорится, что «выбран наиболее конкретный». Перегрузки объектов и строк являются «доступными и применимыми» (применяется String, поскольку нулевой литерал является ссылкой всех типов), а строка более конкретна.

РЕДАКТИРОВАТЬ: Исправлен раздел, в синтаксисе.

+2

Я думаю, что вы хотите 15.12.2. 15.11.2 касается доступа к членам суперкласса с ключевым словом super. – Syntactic

+0

Как я могу назвать наименее специфический метод? если у меня есть foo (Object o); и foo (String s) ;. и я хочу вызвать foo (Object o). что я делаю ? –

2

Значение null может быть установлено в качестве ссылки любого типа. Все перегруженные методы, которые у вас есть, находятся в одной иерархии наследования. Объект < - Строка, выбирается наименее общий. Но если у вас было два перегруженных метода, которые не находятся в одной иерархии, тогда вы получите ошибку компиляции об однозначных методах.

10

Эти методы «перегружены», а не «неоднозначны».

Согласно Java Language Specification:

При вызове метода (§15.12), то количество действительных аргументов (и любые аргументы типа явные) и типы времени компиляции аргументов используются во время компиляции до определяют подпись метода , который будет вызываться (§15.12.2).

И §15.12.2 говорит:

Там может быть более чем один такой метод, в этом случае наиболее конкретный один выбран.

String более специфичен, чем Object, так что в то время как null совместимо с обеими, метод с параметром String выбирается (есть гораздо более сложные правила, которые применяются, когда типы параметров являются частью иерархии класса или интерфейса).

0

Строка - это объект, объект не является строкой, поэтому первая перегрузка составляет более конкретно, чем вторая. См. JLS 15.12.2, как упоминалось в Синтактике.

Смежные вопросы