最近我在Java的Comparator类中发现了以下代码:
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
让我困惑的是
(Comparator<T> & Serializable)
部分。由于该方法仅返回Comparator,因此我不明白将其转换为Serializable的用途。我也不明白为什么要以这种方式转换任何内容,或者我漏看了什么吗?在我看来,如果我想将对象强制转换为多个可能的类型,我可以像这样引入另一种泛型类型:
public static <T, U extends Comparable<? super U>, V extends Comparator<T> & Serializable>
V comparing(Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (V) (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
这样返回值就可以分配给Comparator或Serializable变量。
我唯一能想到的另一个原因是使用该强制转换作为某种类型检查,以查看lambda表达式是否实际返回Serializable。
如果你有这种类型的强制转换经验或者知道这样的转换有什么作用,任何帮助都将不胜感激。
V
声明为返回类型。那就像承诺“无论调用方想要返回什么类型,我都会做到(只要该类型是Comparator <T>
和Serializable
的子类型)”。你不能返回一个未知的调用者选择的类型。 - Holger