簡體   English   中英

創建具有泛型類型的地圖

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

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