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

4

1 回答 1

1

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

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

引用Java 语言规范

如果多个成员方法既可访问又适用于方法调用,则有必要选择一个为运行时方法分派提供描述符。Java 编程语言使用选择最具体方法的规则。

非正式的直觉是,如果第一个方法处理的任何调用可以传递给另一个方法而不会出现编译时类型错误,那么一个方法比另一个方法更具体。

如果SpecificJobInfo延长JobInfo,歧义就会被避免而有利于execute(SpecificJobInfo)

于 2013-02-27T18:55:03.440 回答