18

Java 1.5を使用するようにアプリケーションを変換していますが、次の方法が見つかりました。

  /**
   * Compare two Comparables, treat nulls as -infinity.
   * @param o1
   * @param o2
   * @return -1 if o1<o2, 0 if o1==o2, 1 if o1>o2
   */
  protected static int nullCompare(Comparable o1, Comparable o2) {
    if (o1 == null) {
      if (o2 == null) {
        return 0;
      } else {
        return -1;
      }
    } else if (o2 == null) {
      return 1;
    } else {
      return o1.compareTo(o2);
    }
  }

理想的には、メソッドに同じタイプの2つのComparableを使用させたいのですが、これをどのように変換することは可能ですか?

私は次のことがうまくいくと思いました:

protected static <T extends Comparable> int nullCompare(T o1, T o2) {

しかし、IntelliJの「未加工のタイプ「java.lang.Comparable」のメンバーとしての「compareTo(T)」へのチェックされていない呼び出し」の警告を取り除くことができませんでした。

return o1.compareTo(o2);
4

5 に答える 5

21

次のように変更します。

protected static <T extends Comparable<T>> int nullCompare(T o1, T o2) {

Comparable自体がジェネリック型であるため、これが必要です。

于 2008-09-12T14:24:53.267 に答える
5

ここに奇妙なケースがあります:

static class A {
    ...
}

static class B extends A implements Comparable<A> {
    public int compareTo(A o) {
        return ...;
    }
}

幸いなことに、上記のようなコードはまれですが、 Comparable が Tまたはそのスーパークラスに適用される可能性があると明記されていない限り、 nullCompare() は B の比較をサポートしません。

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

ほとんどの人は上記の微調整の恩恵を受けることはありませんが、エクスポートされたライブラリの API を設計するときに役立つ場合があります。

于 2008-09-17T17:42:56.277 に答える
2

編集できないので、回答を投稿する必要があります。

Comparableは汎用であるため、ネストされたタイプのパラメーターを宣言する必要があります。

protected static <T extends Comparable<? super T>> int nullCompare(T o1, T o2) {

比較可能<?スーパーT>、より柔軟になります。Collections.sortに同じメソッド定義が表示されます

public static <T extends Comparable<? super T>> void sort(List<T> list) {
于 2008-10-22T23:18:25.597 に答える
0

このメソッドを一般化することに意味があるかどうかはわかりません。現在、このメソッドはあらゆる種類の Comparable で機能します。ジェネリック化すると、(まったく同じコードで) 何度も実装する必要があります。共通の祖先を持たない 2 つのオブジェクトを比較できる場合がありますが、一般的なバージョンではこれができません。

ジェネリックを追加しても、コードに安全性は追加されません。安全性の問題は、compareTo の呼び出しで発生します。私が提案するのは、単に警告を抑制することです。有用なことについて実際に警告しているわけではありません。

于 2008-09-22T15:30:53.343 に答える