gpt4 book ai didi

java - 创建具有通用类型的 map

转载 作者:搜寻专家 更新时间:2023-11-01 02:44:10 25 4
gpt4 key购买 nike

我正在尝试创建一个将字符串值映射到函数的映射。这是我创建的界面(如在 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 时遇到了麻烦。理想情况下,我想要这样的东西:

Map<String, Function<Pojo, T extends Comparable<T>>> map = new HashMap<>();

我知道我不能做这样的事情,我目前的解决方法是创建一个带有原始函数的 map 。

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

});
}

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

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

最佳答案

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

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

你的 map 声明现在只是

Map<String, Function<Pojo, ?>> map = new HashMap<>();

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

public <U extends Comparable<? super U>> void sortPojoBy(Function<Pojo, U> f);

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

关于java - 创建具有通用类型的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26577271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com