使用交集类型参数捕获可序列化lambda时的ClassCastException
我复制了在尝试使用类型变量类型交叉点捕获lambda时引发的异常;具体地说,为了进行复制,我尝试捕捉lambda作为使用交集类型参数捕获可序列化lambda时的ClassCastException,lambda,java-8,intersection,classcastexception,type-variables,Lambda,Java 8,Intersection,Classcastexception,Type Variables,我复制了在尝试使用类型变量类型交叉点捕获lambda时引发的异常;具体地说,为了进行复制,我尝试捕捉lambda作为Fwhere: public class Consumers { public static <A, F extends Consumer<A> & Serializable> Consumer<A> serializable(F action) { return action; } p
F
where
:
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
我能够使用消费者。可序列化的
和本地或实例变量;尝试初始化静态变量时引发此异常
这是正确的行为吗?我使用的是最新的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>
Consumers.java:??:错误:不兼容的类型:无法推断类型变量A,F
可序列化(a->{});
^
(参数不匹配;使用者无法转换为INT#1)
其中A、F为类型变量:
在方法中声明的扩展对象,在4.6 M6(Neon)中已修复,并且在此中已注意到它。这是不允许的: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>
Consumers.java:??:错误:不兼容的类型:无法推断类型变量A,F
可序列化(a->{});
^
(参数不匹配;使用者无法转换为INT#1)
其中A、F为类型变量:
在方法中声明的扩展对象,在4.6 M6(Neon)中修复,在本文中已经注意到。eclipse编译器与JDK编译器不同,它们的行为方式有很多不同。也许可以试试使用JDK的编译器javac
或maven或使用JDK编译器的任何东西。eclipse编译器与JDK编译器不同,它们的行为方式有很多不同。也许可以试试使用JDK的编译器javac
或maven或任何使用JDK编译器的东西;我刚刚使用javac,收到了相同的错误;Oxygen编译此文件,但引发异常。尽管如此,与您链接的不同之处在于,消费者是SAM,可序列化是ZAM;您可能认为这将编译(javac)或不会抛出异常(Eclipse)。(Consumer&Serializable)
捕获lambda,但。。。(T arg)
没有(但仅适用于静态字段);我会记下这个答案。谢谢,是的;我刚刚使用javac,收到了相同的错误;Oxygen编译此文件,但引发异常。尽管如此,与您链接的不同之处在于,消费者是SAM,可序列化是ZAM;您可能认为这将编译(javac)或不会抛出异常(Eclipse)。(Consumer&Serializable)
捕获lambda,但。。。(T arg)
没有(但仅适用于静态字段);我会记下这个答案。谢谢