[英]Java generics, explanation needed
有幾個簡單的測試用例類:
public interface ListCriteria<T> {
// some stuff here
}
public class UserListCriteria implements ListCriteria<User> {
// implementation
}
public interface Editor<T> {
// sample method 1
List<T> listObjectsTest1(ListCriteria<T> criteria);
// sample method 2
<L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);
}
還有一個編譯Editor
的實現,Java認為它沒有為兩個示例方法提供必要的實現:
public class UserEditor implements Editor<User> {
@Override
public List<User> listObjectsTest1(UserListCriteria criteria) {
//
}
@Override
public List<User> listObjectsTest2(UserListCriteria criteria) {
//
}
}
兩種方法實現都是錯誤的。 問題是為什么。 特別是對於后一種方法。 當然我可以做interface Editor<T, L extends ListCriteria<T>>
,這將解決問題,但我不想,我想了解為什么我不能在這里使用方法級泛型。
您獲得的錯誤與泛型無關,因為您使用除接口強制之外的其他類型實現該方法。
Editor
界面定義
List<T> listObjectsTest1(ListCriteria<T> criteria);
因此UserEditor
必須在您的情況下實現
public List<User> listObjectsTest1(ListCriteria<User> criteria) {
您不應該將參數的類型與參數的泛型類型混淆。 Editor
界面強制執行ListCriteria
類型。 ListCriteria
的泛型類型是T
, T
可以由子類綁定,例如implements ListCriteria<User>
。 當我說“你得到的錯誤與泛型無關”時,這就是我的意思。
我猜你想要的是什么
public interface Editor<C, T extends ListCriteria<C>> {
List<C> listObjectsTest1(T criteria);
}
然后UserEditor可以實現為
public class UserEditor implements Editor<User, UserListCriteria> {
public List<User> listObjectsTest1(UserListCriteria criteria) {
return null;
}
}
為什么? 特別是對於后一種方法
Editor
界面中的第二個方法
<L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);
並不意味着您可以實現L
的任何類型綁定UserEditor
仍然必須實現
public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
return null;
}
此方法定義將在客戶端調用方法時綁定的泛型類型L
因此,您可以使用任何類型作為ListCriteria<User>
的子類型調用該方法。
UserEditor
listObjectsTest1(UserListCriteria criteria)
函數沒有覆蓋Editor<T>
接口的函數listObjectsTest1(ListCriteria<T> criteria)
,因為它們有兩個不同的簽名,即本質上是參數類型。
對於在接口中聲明的listObjectsTest2
也是如此: <L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);
但是您已在UserEditor
類中將其聲明為: List<User> listObjectsTest2(UserListCriteria criteria)
因此,您需要將簽名更改為:
class UserEditor implements Editor<User> {
@Override
public List<User> listObjectsTest1(ListCriteria<User> criteria) {
}
@Override
public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
}
}
請閱讀jls 8.4.8。 繼承,覆蓋和隱藏更多細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.