2012-02-22 18 views
3

私はBSTプログラムを作成しています。バイナリ演算子 ">"のオペランドタイプが正しくありませんか?

"バイナリ演算子のための悪いオペランドタイプ ">"

第一のタイプ:java.lang.Objectの

第二のタイプ:java.lang.Objectの" これは

私はエラーを取得しますそれは私にエラーを与える方法:

public void placeNodeInTree(TreeNode current, TreeNode t)                  
{ 
    if(current == null) 
     current = t; 
    else{ 
     if(current.getValue() > t.getValue()) 
      current.setRight(t); 
     if(current.getValue() < t.getValue()) 
      current.setLeft(t); 
     } 
} 

のgetValue()オブジェクトの戻り値の型、これjava.lang.Objectのタイプがあります。私がこのエラーを見たのは今回が初めてです。誰も私にこのエラーの背景を教えてもらえますか?ありがとう

+0

これらのオブジェクトには、「オブジェクト」親しか共通していませんか?そうであれば、実際の比較はできません。クラスの実際のタイプ(たとえばinstanceofを使用)を試してみて、その後比較してみてください。または、getValue()をリファクタリングして、[Comparable](http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable)を使用して何かを返すようにしてください。html)、[Comparator](http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html)を使用してください。 –

答えて

6

確かに、オブジェクト間に>演算子を適用することはできません。あなたはそれが何をすると思いますか?他の2項演算子は、-+-/など(文字列の連結を除く)のいずれも適用できません。

理想的には、あなたが作る必要があり、あなたのTreeNodeジェネリック、およびいずれかの任意の2つのインスタンスを比較したり、T extend Comparable<T>をすることができるComparator<T>を持っています。いずれにせよ、あなたはその後、それらを比較することができます:あなたは一般Comparatorを使用し、まだComparableに値をキャストするか、可能性がジェネリックなし

int comparisonResult = comparator.compare(current.getValue(), t.getValue()); 
if (comparisonResult > 0) { 
    // current "greater than" t 
} else if (comparisonResult < 0) { 
    // current "less than" t 
} else { 
    // Equal 
} 

または

int comparisonResult = current.getValue().compareTo(t.getValue()); 
// Code as before 

...しかし、ジェネリック医薬品は次のようになりますより良い賭け。

+0

別の方法でこれを行う方法はありますか? – svsav

+0

@ user1136610:はい - 私の編集を参照してください。 –

1

>または<を使用してオブジェクトを比較することはできません。 compareTo(実装する必要がある)のようないくつかのメソッドを使用してそれらを比較する必要があります。

5

Javaは演算子のオーバーロードをサポートしていないため、<演算子は非プリミティブ型には定義されていません。代わりにComparable<T>インターフェイスを使用することをお勧めします。

1

>演算子を使用して2つの仲裁可能なオブジェクトを比較することはできません。 >演算子は、プリミティブの整数型に対してのみ(直接的に)使用できます。

比較するオブジェクトにインターフェイスjava.lang.Comparableを実装し、それらを比較するためにcompareToメソッドを呼び出すことができます。

Comparable left = (Comparable)current.getValue(); 
Comparable right = (Comparable)t.getValue(); 

if (left.compareTo(right) > 0) 
    current.setRight(t); 

// etc. 
1

デフォルトのequalsの実装では、参照の等価性のみが考慮されます。オブジェクトは、CatがAppleよりも大きくても気にもならないかどうかはわかりません。 equalsとhashcodeの両方をオーバーライドするだけでなく、Comparableインターフェイスを実装する具体的な実装を提供する必要があります。これにより、実際にCatがアップルよりも大きいかどうかを判断することができます。

関連する問題