以下是该方案。如果我有以下类和接口
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 :(得分:1)
这两种方法都适用(因为SpecificJob实现了JobInfo
和SpecificJobInfo
)和可访问(即它们不是超类中的私有方法),规则是始终调用最具体的方法。
在这种情况下,没有最具体的方法,因为JobInfo
和SpecificJobInfo
是不相关的类型(execute
方法的两个变体都是最大特定) 。因此,方法调用不明确,并且发生编译时错误。
引用Java Language Specification:
如果多个成员方法都可访问且适用于a 方法调用,有必要选择一个提供 运行时方法调度的描述符。 Java编程 language使用选择最具体方法的规则。
非正式的直觉是一种方法更具体 如果可以传递第一个方法处理的任何调用,则为另一个 没有编译时类型错误的另一个。
如果SpecificJobInfo
延长JobInfo
,则可以避免歧义,转而使用execute(SpecificJobInfo)
。