2013-02-27 3 views
-2

Вот сценарий. Если у меня есть следующие классы и интерфейсыНаследование - какой метод будет вызываться

public interface Jobinfo {} 

public interface SpecificJobinfo {} 

public abstract class AbstractJob implements JobInfo{} 

public class SpecificJob extends AbstractJob implements SpecificJobInfo{} 

interface Service { 
    execute(JobInfo); 
    execute(SpecificJobInfo); 
} 

// implementing class 

public class ServiceImpl implements Service{ 
    SpecificJob specificJob = new SpecificJob(); 
    execute(specificJob); 
} 

, какой метод будет вызван - один с JobInfo или SpecificJobInfo.

+0

Попробуй и посмотри? –

+0

Рассмотрите возможность тестирования с помощью java-компилятора. Ответ тоже не является. Ссылка на выполнение неоднозначна. – DwB

+1

спасибо dwB - я просто попробовал и дал ошибку компиляции с неоднозначным сообщением. спасибо .. Я думаю, что получил то, что искал. – Ashu

ответ

1

Оба метода применимы (потому что SpecificJob реализует как JobInfo и SpecificJobInfo) и доступны (т.е. они не являются частными методы суперкласса), правило таково, что всегда наиболее специфичный метод будет вызван.

В этом случае не существует наиболее специфический метод, потому что JobInfo и SpecificJobInfo не имеют отношения типа (оба варианта метода execute являются максимально конкретным). Поэтому вызов метода неоднозначен и возникает ошибка времени компиляции.

Цитируя Java Language Specification:

Если более чем один метод член является одновременно доступным и применим к вызова метода, необходимо выбрать один, чтобы обеспечить дескриптор метода времени выполнения отправки. В языке программирования Java язык использует правило выбора самого конкретного метода.

Неофициальная интуиция заключается в том, что один метод более конкретный, чем другой, если любой вызов, обработанный первым методом, может быть передан другому, без ошибки типа компиляции.

Если бы SpecificJobInfo продлен JobInfo, неоднозначность можно было бы избежать в пользу execute(SpecificJobInfo).

+0

Спасибо Хавьер за объяснение причины. Это действительно помогло мне понять суть. – Ashu