2011-01-27 82 views
3

我想在接口中聲明一個方法,其中實現類中定義的方法的參數可以是特定java類的子類型,例如:在Java接口中聲明參數子類型,在Java中使用子類型實現方法

interface Processor{ 
     processRequest(Request r); 
} 

public class SpecialRequest extends Request{...} 

public class SpecialProcessor implements Processor{ 

     processRequest(SpecialRequest r){...} 
} 

但我在SpecialProcessor中遇到錯誤,因爲它沒有正確實現Processor接口。我可以在處理器界面中更改哪些內容以允許SpecialProcessor中的定義工作?

回答

9

您可以鍵入Processor

public interface Processor<R extends Request> { 
    void processRequest(R r); 
} 


public class SpecialProcessor implements Processor<SpecialRequest> { 
    public void processRequest(SpecialRequest r) { 
     ... 
    } 
} 
3

這是正確的 - 記住,呼叫者應該不知道正在使用什麼接口的具體實現。他們只知道他們可以通過Request任何請求)到processRequest,而您的實現會對參數施加更嚴格的約束,從而導致某些方法調用不是類型正確的。

如果你想做到這一點,你需要一個通用的參數添加到界面,類似如下:

interface Processor<R extends Request> { 
    void processRequest(R r); 
} 

public class SpecialProcessor implements Processor<SpecialRequest> { 

    public void processRequest(SpecialRequest r) { ... } 

} 

通過這種方式,希望在「正常」的請求通過來電者必須聲明Processor<Request>類型的變量/字段 - 並且您的SpecialProcessor不再匹配此邊界,因此無法分配,並且在編譯時將被正確拒絕。處理特殊請求的呼叫者可以使用Processor<SpecialRequest>變量/字段,您的類別可以將分配給該變量/字段。