私が抱えている問題は、すでに以前に尋ねられています:インターフェイスが Comparable を拡張する列挙型を使用してインターフェイスを実装する方法は?
ただし、どのソリューションも私の正確な問題を解決するものではありません。これは次のとおりです。
に似た値オブジェクトがありますBigDecimal
。この値は、実際のオブジェクトでは設定されないことがあります。これは、その値がまだわかっていないためです。したがって、 Null オブジェクト パターンを使用して、このオブジェクトが定義されていない時間を表現したいと考えています。Comparable
Null オブジェクトにインターフェイスを実装させようとするまでは、これは問題ではありません。説明する SSCCE を次に示します。
public class ComparableEnumHarness {
public static interface Foo extends Comparable<Foo> {
int getValue();
}
public static class VerySimpleFoo implements Foo {
private final int value;
public VerySimpleFoo(int value) {
this.value = value;
}
@Override
public int compareTo(Foo f) {
return Integer.valueOf(value).compareTo(f.getValue());
}
@Override
public int getValue() {
return value;
}
}
// Error is in the following line:
// The interface Comparable cannot be implemented more than once with different arguments:
// Comparable<ComparableEnumHarness.NullFoo> and Comparable<ComparableEnumHarness.Foo>
public static enum NullFoo implements Foo {
INSTANCE;
@Override
public int compareTo(Foo f) {
return f == this ? 0 : -1; // NullFoo is less than everything except itself
}
@Override
public int getValue() {
return Integer.MIN_VALUE;
}
}
}
その他の懸念事項:
- 実際の例では、
Foo
ここで呼び出しているサブクラスが複数あります。 NullFoo
ではないことでおそらくこれを回避できenum
ますが、それのインスタンスが1つだけであることを保証することはできません。つまり、Effective Java Item 3、pg。17-18