[解決済み】Javaのジェネリックタイプの比較
質問
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()
メソッドを使用します。
関連
-
[解決済み】Javaでユーザー入力を待機させる方法
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。
-
[解決済み] Java enumのメンバーを比較する:==またはequals()?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaで汎用配列を作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み】Gradleがtools.jarを見つけ出さない
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み】Hibernateの例外「failed to lazily initialize a collection of role」の解決方法
-
[解決済み】javaで無効な文字定数
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] Java- <T extends Comparable<T>>の意味?