0

特定のタイプのIDを持つ具象クラスを作成するために拡張する抽象ジェネリックスーパークラスがあります。

public abstract class AbstractEntity<I> {
  ...
  private I id;
  private String name;
  ...
}

次のような具象クラスを作成します。

public class User extends AbstractEntity<Long> {...}

ここで、具体的なクラスをそれ自体の他のインスタンスと比較できるようにしたいと考えています (他の型はありません。これはコンパイル時に適用する必要があります)。デフォルトでは、compareToメソッドは名前でソートする必要があるため、コードの繰り返しを避けるためにスーパークラスに追加したいと考えています。これを行うために私が思いついた唯一の方法は、この醜い構造を使用することです。

public abstract class AbstractEntity<I,T> implements Comparable<AbstractEntity<I,T>> {
  ...
  private I id;
  private String name;
  ...
  @Override
  public int compareTo(AbstractEntity<I,T> o) {
    ...
  }
}

...

public class User extends AbstractEntity<Long,User> {...}

スーパークラスを拡張するために、具体的なクラス名をそれ自体の型パラメーターとしてもう一度繰り返す必要があるため、これは醜いと思います。これは奇妙で直感に反します。私が見逃しているのと同じことを達成するためのよりエレガントな方法はありますか?

ありがとう!

4

4 に答える 4

2

いいえ、これが本来のやり方です。このような状況では、クラス自体をパラメーターの説明に入れることは、実際には通常のことです。

于 2013-04-26T03:15:20.993 に答える
1

これはあなたが探しているものですか

public abstract class AbstractEntity<I> implements
        Comparable<AbstractEntity<I>> {
    private I id;

    @Override
    public int compareTo(AbstractEntity<I> o) {

        if (o != null && !o.getClass().equals(getClass())) {
            throw new IllegalArgumentException("Unsupported instance type "
                    + o.getClass());
        }

        return 0;
    }

}

public class User extends AbstractEntity<Long> {
}
于 2013-04-26T03:20:48.213 に答える