继承 - 将调用哪个方法

时间:2013-02-27 18:36:15

标签: java inheritance

以下是该方案。如果我有以下类和接口

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的方法。

1 个答案:

答案 0 :(得分:1)

这两种方法都适用(因为SpecificJob实现了JobInfoSpecificJobInfo)和可访问(即它们不是超类中的私有方法),规则是始终调用最具体的方法。

在这种情况下,没有最具体的方法,因为JobInfoSpecificJobInfo是不相关的类型(execute方法的两个变体都是最大特定) 。因此,方法调用不明确,并且发生编译时错误。

引用Java Language Specification

  

如果多个成员方法都可访问且适用于a   方法调用,有必要选择一个提供   运行时方法调度的描述符。 Java编程   language使用选择最具体方法的规则。

     

非正式的直觉是一种方法更具体   如果可以传递第一个方法处理的任何调用,则为另一个   没有编译时类型错误的另一个。

如果SpecificJobInfo延长JobInfo,则可以避免歧义,转而使用execute(SpecificJobInfo)