java - デフォルトメソッドを使用して関数インターフェイスの逆インターフェイスを返すにはどうすればよいですか

okwaves2024-01-25  12

「関係」を返したいです。デフォルトのメソッド「negate()」を使用し、常にメソッド test() の逆を返します。どうすればそうなれるでしょうか?

public interface Relation<X,Y> {

    boolean test(X x, Y y);

    default Relation<X,Y> negate() {
        // TODO
        Relation<X, Y> relation = new Relation<X, Y>() {

            public boolean test(X x, Y y) {
                return !this.test(x, y);
            }
            
        };
        return relation;
    }
}

このコードを試してみましたが、スタック オーバーフロー エラーが発生しました。

1

return !this.test(x, y); では、this.test が定義しているデフォルトのメソッドであるため、無限再帰になります。

– ケルウッド

2020 年 9 月 3 日 19:40

1

デフォルトの関係 negate() { return (x, y) ->; !this.test(x, y); }

– チューリング85

2020 年 9 月 3 日 19:40



------------------------

現在の形式の Relation は関数型インターフェイスであるため、negate() から test(...) の結果を反転するラムダを返すことができます。

public interface Relation<X, Y> {
    ...

    default Relation<X, Y> negate() {
        return (x, y) -> !this.test(x, y);
    }
    ...
}

Ideone のデモ

5

ありがとうございます。ラムダ式を使用せずにこれを行う方法はありますか?

– トロリネーター

2020 年 9 月 3 日 20:05

1

いつでもラムダを匿名クラスに変換できます。 return new Relation<X, Y>() { public boolean test(X x, Y y) { return !Relation.this.test(x, y); } };

– チューリング85

2020 年 9 月 3 日 20:08

ありがとうございます。ただし、「Relation.this.test(x, y)」の部分は、なぜ「関係」と書く必要があるのか​​混乱しています。この前に?

– トロリネーター

2020 年 9 月 3 日 20:16

それはどういうわけか、私がインナークラスに属していて、外部クラスのメソッドにアクセスできませんか?

– トロリネーター

2020 年 9 月 3 日 20:17

1

はい。この投稿とその回答をご覧ください。

– チューリング85

2020 年 9 月 3 日 20:19

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。