创建具有通用类型的地图

use*_*315 4 java generics

我正在尝试创建一个将字符串值映射到函数的映射。这是我创建的接口(与 Java 8 中一样,但我无法使用它):

interface Function<T, U> {
    U apply(T t);
}
Run Code Online (Sandbox Code Playgroud)

现在,我创建了一个排序方法来根据某些属性对我的 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));
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

然后我可以调用它传递一个函数的匿名类来按我想要的属性进行排序,例如:

sortBooksBy(new Function<Pojo, Double>(){
                @Override
                public Double apply(Pojo p) {
                    return p.getPrice();
                }
            });
Run Code Online (Sandbox Code Playgroud)

现在我在创建地图时遇到了麻烦。理想情况下我想要这样的东西:

Map<String, Function<Pojo, T extends Comparable<T>>> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

我知道我不能做这样的事情,我当前的解决方法是使用原始函数创建一个地图。

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();
            }

        });
    }
Run Code Online (Sandbox Code Playgroud)

我需要一张地图,因为我从 JSON 配置文件获取属性值(名称、价格等)。

所以我的问题是,有什么方法可以创建我的映射以确保函数的类型 T 与其自身具有可比性?(我现在可以处理解决方法,因为我将手动填写)

Rad*_*def 5

一种方法是更改​​它,以便所有函数都首先返回一个可用的 Comparable。换句话说,将 Map 中的参数移动到 Function 的参数中。

interface Function<T, U extends Comparable<? super U>> {
    U apply(T t);
}
Run Code Online (Sandbox Code Playgroud)

您的地图声明现在只是

Map<String, Function<Pojo, ?>> map = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

您的通用方法sortPojoBy现在还执行 的通配符捕获U

public <U extends Comparable<? super U>> void sortPojoBy(Function<Pojo, U> f);
Run Code Online (Sandbox Code Playgroud)

作为旁注,我稍微更改了您的可比声明。T extends Comparable<? super T>是典型的形式。这是T它提供给 的参数的子类Comparable