[英]Create a map with a generic type
我正在嘗試創建一個將字符串值映射到函數的映射。 這是我創建的接口(如在Java 8中,但我不能使用它):
interface Function<T, U> {
U apply(T t);
}
現在,我創建了一個排序方法,根據一些屬性對我的pojo進行排序:
public <U extends Comparable<U>> void sortPojoBy(Function<Pojo, U> f) {
Collections.sort(list, new Comparator<Book> () {
@Override
public int compare(Pojo first, Pojo second) {
return f.apply(first).compareTo(f.apply(second));
}
});
}
然后我可以調用它傳遞一個函數的匿名類來按我想要的屬性排序,例如:
sortBooksBy(new Function<Pojo, Double>(){
@Override
public Double apply(Pojo p) {
return p.getPrice();
}
});
現在我在制作地圖時遇到了麻煩。 理想情況下,我想要這樣的事情:
Map<String, Function<Pojo, T extends Comparable<T>>> map = new HashMap<>();
我知道我不能做這樣的事情,我目前的解決方法是使用原始函數創建一個地圖。
private Map<String, Function> map = new HashMap<>();
{
map.put("price", new Function<Pojo, Double>(){
@Override
public Double apply(Pojo t) {
return t.getPrice();
}
});
map.put("name", new Function<Pojo, String>(){
@Override
public String apply(Pojo t) {
return t.getTitle();
}
});
}
我需要一張地圖,因為我從JSON配置文件中獲取了屬性值(名稱,價格等)。
所以我的問題是,有沒有辦法創建我的地圖以確保函數的類型T與自身相當? (我現在可以處理解決方法,因為我會手動填寫)
一種方法是更改它,以便所有函數首先確保返回可用的Comparable。 換句話說,將Map中的參數移動到Function的參數。
interface Function<T, U extends Comparable<? super U>> {
U apply(T t);
}
您的地圖聲明現在只是
Map<String, Function<Pojo, ?>> map = new HashMap<>();
您的通用方法sortPojoBy
現在還執行U
的通配符捕獲。
public <U extends Comparable<? super U>> void sortPojoBy(Function<Pojo, U> f);
作為旁注,我稍微改變了您的可比較聲明。 T extends Comparable<? super T>
T extends Comparable<? super T>
是典型的形式。 這是因為T
是它為Comparable
提供的參數的子類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.