微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 类型安全地创建要传递给Comparator.comparing()的Function实例

假设我有一个带有以下签名的方法
<T,U extends Comparable<? super U>> Comparator<T> method(Map<String,Function<? super T,? extends U>> comparatorFunctionMap)

方法接受函数映射(使用字符串键)并创建比较器< T>.结果(如何重要).映射值是Function&lt ;?的实例超级T,?扩展U>,以便它们可以直接传递给Comparator.comparing().

如何以类型安全的方式填充此地图?假设我有一个具有属性名称和年龄的人员(以及他们的getters).

当我执行以下操作时:

Map<String,Function<? super Person,? extends Comparable>> map1 = new HashMap<>();
map1.put("name",Person::getName);
method(map1);

我在第1行和第3行收到警告.如果我尝试这样做,例如:

Map<String,? extends Comparable<?>>> map2 = new HashMap<>();
map2.put("name",Person::getName);
method(map2);

第三行是编译错误.

有没有办法安全地做这种类型?

解决方法

如果你想在地图中添加Person :: getName和Person :: getAge,你将无法使用你提出的方法签名,因为没有U是String,Integer和可比.

基本上,您的地图是Map< String,Function< T,Comparable<?>>因为可比对象在类型方面彼此无关.

我不认为你可以在不使用原始类型的情况下绕过它,这可能如下所示.请注意,您仍然具有类型安全性(您必须将Comparable传递给地图).

static void m() {
  Map<String,Function<Person,Comparable<?>>> map = new HashMap<>();
  map.put("name",Person::getName);
  map.put("age",Person::getAge);
  Comparator<Person> c = method(map);
}


@SuppressWarnings(value = {"unchecked","rawtypes"})
static <T> Comparator<T> method(String name,Map<String,Function<T,Comparable<?>>> comparatorFunctionMap) {
  Function f = (Function) comparatorFunctionMap.get("age");
  Comparator<T> c = Comparator.comparing(f);
  return c;
}

唯一(我认为)这个限制是从技术上讲,可以通过一个奇怪的类说Weird实现Comparable< String>这可能会导致运行时错误.

原文地址:https://www.jb51.cc/java/128834.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐