2012-02-20 148 views
3

我遇到了Java中泛型的問題,我無法找到類似方式使用泛型的人的在線解決方案或示例。我有一組處於相同請求/響應結構中的方法。例如,用戶填充Request對象中的字段,將該對象傳遞給幫助器方法,並且它們返回Response對象。我的所有請求對象都從一個公共的Request超類(以及類似於Response超類的Response對象)擴展而來。我希望我的助手類也具有一致的結構,因此我使用了一個接口。下面是一些代碼來說明...接口中的Java泛型

請求超類:

public class SuperRequest { 
    // ... 
} 

示例請求子類:

public class SubRequest extends SuperRequest { 
    // ... 
} 

響應超類:

public class SuperResponse { 
    // ... 
} 

實施例響應亞類:

public class SubResponse extends SuperResponse{ 
    // ... 
} 

接口:

public interface SomeInterface { 
    public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request); 
} 

你可以從界面看,我想傳遞一個對象,它是SuperRequest一個孩子,我想返回一個對象,它是SuperResponse一個孩子。下面是我的實現:

public class SomeImplementation implements SomeInterface { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
} 

在Eclipse中,我得到的編譯錯誤,因爲編譯器告訴我,我有未實現的方法和@Override符號「沒有覆蓋的超類型方法」。

任何人都可以幫助我嗎?我的語法是不正確的還是我對泛型的理解有點偏離?任何幫助是極大的讚賞!

回答

7

試着改變你的接口和實現到:

interface SomeInterface<T extends SuperRequest, U extends SuperResponse> { 
    public U someMethod(T request); 
} 

class SomeImplementation implements SomeInterface<SubRequest, SubResponse> { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
} 
+0

太棒了!我有一種感覺,我只是在語法/聲明上有點偏離。謝謝您的幫助! – ggrigery 2012-02-20 16:51:17

+0

沒問題,一定要接受最好的答案;) – ggreiner 2012-02-20 16:51:45

1

因爲它的立場,中SomeInterface的實現必須實現參數化方法,即:

public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request); 

它不能選擇一個特定的子類以替代TU

接口本身必須是通用的SomeInterface<T extends SuperRequest, U extends SuperResponse>,然後子類可以選擇TU的具體實現。

1

當你實現接口時,你必須聲明類型。試試這個:

public class SomeImplementation implements SomeInterface<SubRequest,SubResponse> { 

    @Override 
    public SubResponse someMethod(SubRequest request) { 
     return null; 
    } 
}