1. ホーム
  2. java

[解決済み】Javaのジェネリックタイプの比較

2022-02-09 07:14:44

質問

Javaで、再帰を使ってノードを追加するバイナリサーチツリークラスを書きました。今、私はジェネリックスを使ってそれを一般化したいので、ジェネリックスについてもっと学ぶことができます。

public class GBinNode<T> {
    T item;
    GBinNode<T> left;
    GBinNode<T> right;

public GBinNode(T newItem) {
    item = newItem;
    left = null;
    right = null;
    }
public GBinNode(T it, GBinNode<T> le, GBinNode<T> ri) {
    item = it;
    left = le;
    right = ri;
    }
public String toString() {
    return item.toString()+" ";
    }
}

ノードを追加する関数は、以下のクラスにあります。

public class GBinTree<T extends Comparable <T>> {
  GBinNode<T> add(T item, GBinNode<T> bn) {
    if (bn==null) {
        return new GBinNode<T>(item, null, null);
    }
    if (item < bn.item) {        // ERROR HERE
        bn.left = add( item, bn.left);
    }
    else {
        bn.right = add( item, bn.right);
    }
    return bn;
}

public void toString(GBinNode<T> root) {
    GBinNode<T> curr = root;
    if (curr == null)
        return;
    else {
        toString(curr.left);
        System.out.println(curr.toString());    // inorder traversal
        toString(curr.right);
    }
}

メインクラスには、次のようなコードがあり、物事を開始します。私は文字列を使っていますが、データ型は何か複雑な型でも構いません。

GBinTree<String> bt = new GBinTree<String>();
    GBinNode<String> root = null;
    root = bt.add("Calex", root);
    root = bt.add("Ealex", root);
    root = bt.add("Balex", root);
    root = bt.add("Dalex", root);       
    bt.toString(root);

Comparableインターフェイスを使い始めたけど、じゃあCompareTo()関数はどう書けばいいんだ?Tがどんな型になるのかわからないのですが?エラーは "The operator < is undefined for the argument type(s) T, T" と出た。

解決策を検索してみると、ある回答は ジェネリックタイプの比較 Java :

class Element<T extends Comparable<T>>

これがどこに行くべきなのか、Comparableを実装しているクラスとどう違うのか、よくわかりません。型がわかるのはメインクラスだけなので、compareTo()はそこにあるべきなのでしょうか?GBinTreeをインターフェースにすることも考えましたが、それが正しいのかどうかわからなくなってしまいました。どんな助けでも感謝します。

解決するには?

Javaでは、演算子をオーバーロードすることはできません。そのため < 演算子はプリミティブ(または数値)型にのみ適用され、参照型には適用されません。したがって T は参照型を表す型変数なので < 型の変数で T . を使用する必要があります。

if (item.compareTo(bn.item) < 0) 

は、返された値をチェックして、それを使って何をするか決めます。

の型が何であるかは分からない。 T を実装する型であることは分かっています。 Comparable を実装しており、そのため compareTo() メソッドを使用します。