2013-02-27 154 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

试试看看? – 2013-02-27 18:38:35

+0

考虑使用java编译器进行测试。答案既不是。执行的引用是不明确的。 – DwB 2013-02-27 18:47:26

+1

谢谢dwB - 我只是试过了,它给模糊的消息编译错误。谢谢..我想我得到了我正在寻找的东西。 – Ashu 2013-02-27 18:54:25

回答

1

两种方法都适用(因为SpecificJob同时实现JobInfoSpecificJobInfo)和访问(即他们不是在一个超类私有方法),该规则是永远最具体方法将被调用。

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

引述Java Language Specification

如果不止一个成员方法既方便和适用于 方法调用,就必须选择一个提供 描述符运行时方法分派。 Java编程 语言使用选择最具体方法的规则。

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

只好SpecificJobInfo扩展JobInfo,模糊性将被避免赞成execute(SpecificJobInfo)

+0

感谢哈维尔解释原因。这真的帮助我了解基本知识。 – Ashu 2013-02-27 19:09:09