Java 创建具有泛型类型的映射

Java 创建具有泛型类型的映射,java,generics,Java,Generics,我试图创建一个映射,将字符串值映射到函数。以下是我创建的接口(与Java 8中的接口相同,但我无法使用它): 接口函数{ U应用(T); } 现在,我创建了一个排序方法,根据一些属性对pojo进行排序: public <U extends Comparable<U>> void sortPojoBy(Function<Pojo, U> f) { Collections.sort(list, new Comparator<Book>

我试图创建一个映射,将字符串值映射到函数。以下是我创建的接口(与Java 8中的接口相同,但我无法使用它):

接口函数{
U应用(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));
            }
        });
}
public void sortPojoBy(函数f){
Collections.sort(列表、新比较器(){
@凌驾
公共整数比较(Pojo第一,Pojo第二){
返回f.apply(第一个)。与(f.apply(第二个))进行比较;
}
});
}
然后我可以通过传递一个匿名函数类来调用它,以按我想要的属性进行排序,例如:

sortBooksBy(new Function<Pojo, Double>(){
                @Override
                public Double apply(Pojo p) {
                    return p.getPrice();
                }
            });
sortBooksBy(新函数(){
@凌驾
公开双重申请(Pojo p){
返回p.getPrice();
}
});
现在我很难创建地图。理想情况下,我想要这样的东西:

Map<String, Function<Pojo, T extends Comparable<T>>> map = new HashMap<>();
Map Map=newhashmap();
我知道我不能这样做,我目前的解决方法是用一个原始函数创建一个映射

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

        });
    }
interface Function<T, U extends Comparable<? super U>> {
    U apply(T t);
}
private Map=new HashMap();
{
map.put(“price”,新函数(){
@凌驾
公开双重申请(Pojo t){
返回t.getPrice();
}           
});
map.put(“名称”,新函数(){
@凌驾
公共字符串应用(Pojo t){
返回t.getTitle();
}
});
}
我需要一个映射,因为我从JSON配置文件获取属性值(名称、价格等)


所以我的问题是,有没有办法创建我的映射,以确保函数的类型T与它本身是可比的?(我现在可以处理解决方案,因为我将手动填充)

一种方法是对其进行更改,以便所有函数首先都能返回可用的可比较值。换句话说,将映射中的参数移动到函数的参数

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

        });
    }
interface Function<T, U extends Comparable<? super U>> {
    U apply(T t);
}

作为旁注,我稍微改变了你的类似声明<代码>T扩展可比性非常好!谢谢:)
public <U extends Comparable<? super U>> void sortPojoBy(Function<Pojo, U> f);