【发布时间】:2017-08-14 22:42:24
【问题描述】:
查看java.util.Comparator in the JDK 8 source code,发现了有趣的代码:
public static <T, U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T, ? extends U> keyExtractor){
Objects.requireNonNull(keyExtractor);
// casting to Serializable?
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
很清楚为什么我们将生成的 lambda 转换为 Comparator<T>,但将其转换为 Serializable 的目的是什么?
【问题讨论】:
-
相关:stackoverflow.com/questions/22807912/how-to-serialize-a-lambda -- 并注意 Oracle 如何“强烈反对”这种做法:docs.oracle.com/javase/tutorial/java/javaOO/… -- 您在哪里找到此代码?
-
@slim 代码来自
java.util.Comparator -
有趣。我的猜测是,除非他们这样做,否则如果 any 类包含比较器(或者他们必须付出额外的努力),则没有人可以使该类可序列化。但我从来没有过多使用过
serialize(),所以会等待看到更权威的答案。
标签: java generics lambda java-8 comparator