Java函数接口中的泛型类型安全
我已经达到了处理Java类型系统的能力极限。情况是这样的:
我需要一个可以接受Collection<Comparable>
的方法和一个将Collection<Comparable>
作为输入并从该集合返回单个元素的函数
这似乎是这样做的:
private <T extends Comparable<T>> Comparable<T> applyFunctionOnStuff(
final Collection<Comparable<T>> stuff,
final Function<Collection<Comparable<T>>, Comparable<T>> function) {
return function.apply(stuff);
}
但是我无法将Collections::max
转换为函数的有效输入。我想知道是否有一种方法可以将这样的静态方法包装到Function
类中,并在这个方法中使用它们
# 1 楼答案
我认为如果你接受你自己的答案是可以的,但我想指出的是
Comparable
通常必须声明为Comparable<? super T>
,否则你将以泛型类型怪异而告终。您的返回类型应该是T,而不是Comparable<T>
我也不明白你所做的比直接调用相关函数更简单。您的方法似乎使代码变得更加模糊
# 2 楼答案
修正了它:
这似乎神奇地接受了
applyFunctionOnStuff(new ArrayList<Integer>(), Collections::max);
这样的输入# 3 楼答案
代码中有一点冗余,因为类型
T
被定义为T extends Comparable<T>
,然后每次引用类型T
时,您都会按如下方式使用:Comparable<T>
实际上应该是T
本身因此,您的代码应该如下所示:
然后您可以使用
Collections::max
而不会出现任何进一步的错误