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