在Java的功能接口中键入安全性

Spo*_*ter 3 java generics java-8

我已经达到了处理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);
}
Run Code Online (Sandbox Code Playgroud)

但后来我无法弯曲Collections::max成为该函数的有效输入.我想知道是否有办法将这样的静态方法包装到Function类中并在此方法中使用它们.

Lin*_*ica 5

在T定义类型时,代码中有一些冗余,T extends Comparable<T>然后每次引用类型时T都按如下方式使用它:Comparable<T>实际上应该只是T它自己.

所以你的代码应该是这样的:

private <T extends Comparable<T>> T applyFunctionOnStuff(
    final Collection<T> stuff,
    final Function<Collection<T>, T> function) {
    return function.apply(stuff);
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用Collections::max没有任何进一步的错误