簡體   English   中英

如何在子類型上使用為泛型超類型聲明的Guava函數?

[英]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 = ...

更多信息: 什么是PECS(Producer擴展消費者超級)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM