使用交集类型参数捕获可序列化lambda时的ClassCastException

使用交集类型参数捕获可序列化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

我复制了在尝试使用类型变量类型交叉点捕获lambda时引发的异常;具体地说,为了进行复制,我尝试捕捉lambda作为
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)
没有(但仅适用于静态字段);我会记下这个答案。谢谢