1

ラムダをキャプチャするために型変数型の交差を使用しようとしたときにスローされた例外をレプリケートしました。私は、ローカルまたはでConsumers.serializableを使用することができるよ交差型パラメータでシリアライズ可能なラムダをキャプチャするときのClassCastException

java.lang.ClassCastException: [insert lambda name] cannot be cast to java.util.function.Consumer 

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 

次がスローされた例外の例です。具体的には、私はFとしてラムダ<A, F extends Consumer<A> & Serializable>をキャッチしようとし、複製しますインスタンス変数;この例外は、静的変数を初期化しようとしたときにスローされます。

この動作は正しいですか?私は最新のEclipse Oxygen、JDK u112を使用しています。

+1

eclipseコンパイラはJDKとは異なり、動作方法にはかなりの違いがあります。おそらく、JDKのコンパイラを使ってみてください。 'javac'かmavenか、JDKのコンパイラを使用するものを使用します。 –

答えて

0

これは許されるべきではない: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> 

それは実際に4.6 M6(ネオン)で固定Eclipseのコンパイラbug、であり、それはすでにこのother questionで注目されています。

+0

ええ;私はちょうどjavacを使い、同じエラーを受けました。酸素はこれをコンパイルしますが、例外がスローされます。しかし、あなたがリンクしている[その他の質問](http://stackoverflow.com/questions/35268927/lambda-and-cast-intersection-type-eclipse-compiler-bug)との違いは、コンシューマはSAMであり、シリアライザブルはZAM。これがコンパイル(javac)したり、例外(Eclipse Oxygen)をスローしないと思うでしょう。 '(Consumer &Serializable)はラムダを捕まえますが、' &Serializable> ...(T arg) 'はしません(静的フィールドのみ)。私はこの答えに印をつけます。ありがとう。 – bizness86

関連する問題