2017-06-20 6 views
15

This questionは現在3歳以上であり、具体的にはJava 8に対応しており、受け入れられた回答もJava SE 8 Final Specificationとなっています。ラムダ式にJava 9でアノテーションを付けることは可能でしょうか?

この質問に関する何かがJava 9で変更される場合、私は興味があります:対応する匿名クラスに注釈を付けるのと同様のラムダ式に注釈を付ける方法はありますか?


例:

注釈:匿名クラスの

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE_USE) 
public @interface MyTypeAnnotation { 
    public String value(); 
} 

の作業注釈:

Consumer<String> consumer = new @MyTypeAnnotation("Hello ") Consumer<String>() { 
    @Override 
    public void accept(String str) { 
     System.out.println(str); 
    } 
}; 

が現在のJava 8で動作しない、ラムダ式を注釈:

Consumer<String> myAnnotatedConsumer = @MyTypeAnnotation("Hello") (p -> System.out.println(p)); 
+0

これら2つの構文の重要な違いの1つは、匿名クラスが依然としてクラスの宣言であることです。ラムダ式は新しいクラスを作成しません(またはそれが実装の詳細である場合は必ずしもそうではありません)。注釈は*宣言*にのみ許可されているという印象があります。注釈は*表現*に許可されていますか? – Lii

答えて

13

StackOverflowの質問の存在は、そのような機能は、誰かがこれまでにそれを検討していないにもいることを、計画されていることを示すのに十分ではありません。

list of JEPsを見ると、そのようなJEPがないことがわかります。ドラフト状態であっても、そのような機能を示唆していません。あなたはJavaの9のLambdaMetafactoryの現在の状態を見れば

また、あなたは何の変化が記録された注釈データとランタイムクラスを生成することが必要となるメタ情報を渡すサポートするために行われていないことがわかります。

実際にはスローアウェイコードのほんの一部であるべきものにたくさんのメタ情報を追加することが望ましいと思われますが、言語設計者がそれに従うことは疑いの余地があります。ラムダ式は、の動作をカプセル化する関数を定義するためのものであり、匿名クラスを記述する別の方法ではありません。長期的な進化はむしろ普通のクラスではないラムダ表現の実装につながるでしょう。

+2

'...普通のクラスでさえもらえません。私はそれが起こるのを待つことができず、そのために必要となる変更 – Eugene

7

What's new in Oracle JDK 9ページによると、いいえ。これはもちろんJavaの9に

を変更していない、それは決定的ではありませんが、Javaの9のためのJLSはまだ発売されていません。

6

それは彼らが経由InnerClassLambdaMetafactory.spinInnerClassでのラムダ式「を表して」という内部クラスに注釈を付けないことは興味深いです:

mv.visitAnnotation("Ljava/lang/invoke/LambdaForm$Hidden;", true) 

しかし、それはそれ自体はラムダ、明らかにクラスがない注釈付けされます。

私が見ることができる限り、暗黙的にinvokedynamicLambdaMetafactoryへの変更を必要とするラムダ注釈 - とinvokedynamicのはないラムダのためのクラスを作成したときに何が起こるのだろうが、それ以外何かどうなるのかを、それらのアノテーションには

関連する問題