[英]How to use Guava functions declared for a generic super-type on a sub-type?
我知道標題不是非常具有描述性,但我無法想出更好的東西。 這更多是關於我(缺乏)對仿制葯的一般理解而不是關於番石榴。
我們假設我有一個這樣的界面:
public interface HasId {
String getId();
}
我有一個聲明如下的函數:
private static Function<? extends HasId, String> getId = new Function<HasId, String>() {
public String apply(HasId input) {
return input.getId();
}
};
為什么我不能在例如這樣的排序中使用此函數(這會生成getId具有錯誤泛型類型的編譯器錯誤):
List<String> ids = ...;
List<SomeTypeImplementingHasId> someStuff = ...;
Ordering<SomeTypeImplementingHasId> byIds = Ordering.explicit(ids).onResultOf(getId);
List<SomeTypeImplementingHasId> sortedByGivenIds = byIds.sortedCopy(someStuff);
我知道我可以使用包裝器函數來執行此操作,如下所示:
@SuppressWarnings("unchecked")
<T extends HasId> Function<T, String> getIdFunc() {
return (Function<T, String>)getId;
}
但是,有沒有一些方法不需要這種未經檢驗的演員?
編輯:這解決了我的問題,感謝@Natix和@Jean Logeart:
我首先要在函數聲明中刪除通配符:
Function<HasId, String> getId = ...
然后我不得不改變我在超類上打字的順序:
Ordering<HasId> byIds = Ordering.explicit(ids).onResultOf(getId);
您可以:
Function<HasId, String> getId = ...
Function<? super HasId, String> getId = ...
Function<? super HasId, String> getId = ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.