Javaでジェネリック型のリストをソートする方法

すべて共通の属性を共有する一連のクラスがあるので、共通の基本クラス BaseEntity を拡張しました。たとえば、 FooはBaseEntity を拡張し、 BarはBaseEntity を拡張します。

I also want lists of these Foo and Bar objects to be sortable, so I have implemented Comparable. I have the classes defined as Foo extends BaseEntity implements Comparable and Bar extends BaseEntity implements Comparable, and sorting of lists of Foos or Bars works as expected - and, of course, the details of the sorting are different in the different subclasses. But I can't work out how to make my sorting work when I don't know in advance whether I'll have Foos or Bars. This code, for example, fails to compile:

public class UtilityClass {

  ...bunch of stuff...

  List values;

  public List sort() {
    Collections.sort(values);
    return values;
  }

  ...more methods...
}

with the error message Bound mismatch: The generic method sort(List) of type Collections is not applicable for the arguments (List). The inferred type T is not a valid substitute for the bounded parameter >

I think the problem is that I am attempting to sort a list of BaseEntity objects, and BaseEntity itself doesn't implement Comparable. But now I face a problem: the only sensible thing to make BaseEntity objects comparable to is other BaseEntity objects, but when I add implements Comparable to BaseEntity, the compiler tells me that I've got problems now because my Foo class is trying to implement both Comparable and Comparable, which evidently is not allowed.

I know I could sidestep this issue by dropping the implements Comparable and just implementing Comparable, but then my compareTo methods will have to do ugly casting, and I thought that was exactly the sort of problem using generics was supposed to avoid.

私が本当にしたいのは、 BaseEntity のシグネチャで、すべてのサブクラスは Comparable であるが、同じサブクラスのインスタンスのみに指定することです。

あらゆる援助を感謝して受け取りました。ありがとう!

7
nl ru de
タイプのリストではなく、オブジェクトのリストをソートしたいと思いますか?
追加された 著者 Ingo,
したがって、 Bar のリストまたは Foo のリストのいずれかを持ちますが、両方に同じリストはありません。あなたの MyList テンプレートはもっと関わっていますか?そうでない場合は、問題の原因となっている不要なレイヤーのようです。
追加された 著者 Karthik T,
はい、私のリストは Foo または Bar のいずれかであり、 MyList は問題を示す最小のコードのサンプルです。持っている。本当のクラスははるかに複雑です。
追加された 著者 Dave Mulligan,

3 答え

次のように交差タイプを使用します。

public class MyList> {...}

つまり、Tは BaseEntity Comparable の両方でなければなりません。

7
追加された
@newacct cn u >実際には?
追加された 著者 Tushar Banne,
最良の結果を得るには、 >
追加された 著者 newacct,
@TusharBanne: Comparable はコンシューマなので、常にで使用する必要がありますか?スーパーのワイルドカードを使用します。 がなければ? super ワイルドカードの場合、それ自身に匹敵するクラスがある場合、そのサブクラスはここで T として使用することはできません。
追加された 著者 newacct,
MyList クラスは、エラーメッセージを表示するための単なる例でした。私は悪い名前を選んだ:-(これは実際に何かのリストではなく、このクラスのインスタンスはソートを実行するだけで、実際にソート可能ではありません。
追加された 著者 Dave Mulligan,
ああ、そうです、あなたは正しいです。 Comparable My ではなく T に適用されます。ありがとう、ありがとう、ありがとう。
追加された 著者 Dave Mulligan,
私はそれがなぜ答えの適用性を変えるのか分からない。 :)
追加された 著者 Dolda2000,
Java 5のジェネリックスが不足しているためです。 Comparable Comparable の両方を実装しようとするようなエラーは明らかに許可されていません。
追加された 著者 notXX,

Don't use Collections.sort(List), use Collections.sort(Lst, Comparator<? extends T>) instead. Write the comparation code in the comparator.

2
追加された

これを試して:

static > sort(T[] array);

これは、タスクを達成するための最も一般的な仕様です。基本的には、Tはそれ自身と比較できる型であると主張する。

0
追加された