2014-12-02 2 views
5

У меня есть следующие 2 методы перегруженных в классе:метод перегрузки и передачи нуль

public class Test{ 

    public static void main(String []args) throws ParseException{ 
     Test t = new Test(); 
     t.testMethod(null); 
    } 

    public void testMethod(Object o){ 
    System.out.println("Object"); 
    } 

    public void testMethod(String s){ 
    System.out.println("String"); 
    } 
} 

Когда я вызываю метод testMethod распечатать «String».

Когда я добавляю еще один перегруженный метод:

public void testMethod(StringBuilder sb){ 
    System.out.println("String"); 
} 

Он бросает мне компилятор ошибки: The method testMethod is ambigous for type Test ..

Все это происходит, когда я вызываю метод с null

Мои вопросы:

  1. Почему это печатает Строка, а не объект ?
  2. Почему возникает ошибка компиляции при добавлении третьего метода?
+0

Помимо вашего конкретного вопроса, я предлагаю вам избегать наличия одной подписи с объектом parm и другими с определенным типом данных. Было бы неплохо, если бы это было уловкой, но они обычно скрывают ловушки. –

ответ

1

Почему он печатает строки, а не объект?

Java-компилятор выбирает метод с наиболее специфичную или наименьшего общего аргумента. Поскольку Object является Суперклассом всех классов (включая String), String класс выбран.

Почему возникает ошибка компиляции при добавлении третьего метода?

С String и StringBuilder ниже Object, компилятор найдет вызов неоднозначного поскольку как String и StringBuilder может принимать null, компилятор не может определить, какой метод для вызова, следовательно, вы получите ошибку во время компиляции.

Если попробовать то же самое с IOException и FileNotFoundException вместо String и StringBuilder, вы обнаружите, что FileNotFoundException определена, так как она является наименее универсальным.

3

Метод разрешения работает, выбирая метод , применимый для данных аргументов. В вашем первом случае String более «специфичен», чем Object (так как это подкласс Object), и поэтому выбирается метод String.

При добавлении другого метода, который принимает StringBuilder, так что и метод String одинаково «конкретный» (они являются прямыми подклассами Object), поэтому существует неопределенность относительно того, к которому должен быть выбран, следовательно, ошибка ,

0

В случае1 String наследует объект Object, они находятся в цепочке наследования, нуль соответствует совпадению, компилятор выбирает более конкретный тип - String.

В случае, если 2 String и StringBuilder не находятся в цепочке наследования, компилятор не может выбрать более конкретный тип.

Сведения о перегруженном методе описаны в JLS 15.12.2.

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