私はちょうど1つの抽象メソッドを持つ2つのインターフェイスを持っていると仮定します。これらのインタフェースを持って、私はそれでラムダを宣言することができます。特定のインターフェイスでlambdaを制限する
interface A {
int c();
}
interface B {
int c();
}
public class Main {
public static void main(String... args) {
A a =() -> 42;
B b =() -> 42;
}
}
短い質問:いくつかのトリックがあるかラムダのためのインタフェースA
を使用して制限し、そうしようとする試みでビルドを失敗するハックを?汚いかどうかのヒントは歓迎です(「ダーティ」とは、編集/バイトコードレベルのハックを意味します。ソースや、好ましくは公開契約に影響を与えません)。
ロングストーリー:一部のインターフェースの実装者のために、契約の一部としてequals/hashCode
を定義することを検討します。また、私はequals/hashCode
をビルド時に自動的に生成します。
この文脈では、ラムダはトラブルメーカーです。インターフェイスA
の普通の、そして匿名の実装者のために、私は.class
ファイルを見つけ出し、ビルド時にそのバイトコードを計測することができます。ラムダの場合、実行時に生成されるVM匿名クラスがあります。そのようなクラスに影響を与えるのはビルド時には不可能と思われるので、少なくとも特定のインターフェイスセットに対してこのような機会を禁止する必要があります。
「Long story」ですべての理由を既に説明しました。それは十分詳細ではありませんか? – skapral
うまくいけば、lambdaは 'equals'と' hashCode'を全く定義できないので、なぜこのインターフェースを '@ FunctionalInterface'として使用できないのでしょうか? – Eugene
@Eugene、equalsとhashCodeが定義されていることが、インタフェース 'A'によって提供されるコントラクトの一部であると想像してください。そのjavadocで言うように - 'インターフェースAのすべての実装者は、これとそのガイドラインに従ってequalsとhashCodeを定義しなければなりません...ツールXがあなたのために生成することができます。そして、誰かがラムダと会い、契約を激しく破り、ツールXはそれについて何もできません。私がインターフェース 'A'を定義したとき、私はそれが機能的なインターフェースであるとは思わなかった。私はそれを1つのメソッドとの単なるインターフェースにしたかったのです。 – skapral