捕获具有交集类型参数的可序列化 lambda 时出现 ClassCastException
ClassCastException when capturing a serializable lambda with intersection type parameters
我复制了尝试使用类型变量类型交集捕获 lambda 时抛出的异常;具体来说,为了复制,我试图将 lambda 捕获为 F
where <A, F extends Consumer<A> & Serializable>
:
public class Consumers {
public static <A, F extends Consumer<A> & Serializable>
Consumer<A> serializable(F action) {
return action;
}
public static <A> Consumer<A> vary(Consumer<? super A> action) {...}
private static final Consumer<Object> DOES_NOTHING =
serializable(a -> {});
public static <A> Consumer<A> doesNothing() {
return vary(DOES_NOTHING);
}
...
}
Consumer<String> action = Consumers.doesNothing(); // throws class cast exception
下面是抛出异常的例子:
java.lang.ClassCastException: [insert lambda name] cannot be cast to java.util.function.Consumer
我可以将 Consumers.serializable
与局部变量或实例变量一起使用;尝试初始化静态变量时抛出此异常。
这是正确的行为吗?我正在使用最新的 Eclipse Oxygen,JDK u112。
这不应该被允许:javac
抱怨:
Consumers.java:??: error: incompatible types: cannot infer type-variable(s) A,F
serializable(a -> {});
^
(argument mismatch; Consumer<Object> cannot be converted to INT#1)
where A,F are type-variables:
A extends Object declared in method <A,F>serializable(F)
F extends Consumer<A>,Serializable declared in method <A,F>serializable(F)
where INT#1 is an intersection type:
INT#1 extends Object,Serializable,Consumer<Object>
它实际上是一个Eclipse编译器bug, fixed in 4.6 M6 (Neon), and it has already been noticed in this 。
我复制了尝试使用类型变量类型交集捕获 lambda 时抛出的异常;具体来说,为了复制,我试图将 lambda 捕获为 F
where <A, F extends Consumer<A> & Serializable>
:
public class Consumers {
public static <A, F extends Consumer<A> & Serializable>
Consumer<A> serializable(F action) {
return action;
}
public static <A> Consumer<A> vary(Consumer<? super A> action) {...}
private static final Consumer<Object> DOES_NOTHING =
serializable(a -> {});
public static <A> Consumer<A> doesNothing() {
return vary(DOES_NOTHING);
}
...
}
Consumer<String> action = Consumers.doesNothing(); // throws class cast exception
下面是抛出异常的例子:
java.lang.ClassCastException: [insert lambda name] cannot be cast to java.util.function.Consumer
我可以将 Consumers.serializable
与局部变量或实例变量一起使用;尝试初始化静态变量时抛出此异常。
这是正确的行为吗?我正在使用最新的 Eclipse Oxygen,JDK u112。
这不应该被允许:javac
抱怨:
Consumers.java:??: error: incompatible types: cannot infer type-variable(s) A,F
serializable(a -> {});
^
(argument mismatch; Consumer<Object> cannot be converted to INT#1)
where A,F are type-variables:
A extends Object declared in method <A,F>serializable(F)
F extends Consumer<A>,Serializable declared in method <A,F>serializable(F)
where INT#1 is an intersection type:
INT#1 extends Object,Serializable,Consumer<Object>
它实际上是一个Eclipse编译器bug, fixed in 4.6 M6 (Neon), and it has already been noticed in this