「関係」を返したいです。デフォルトのメソッド「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