2012-02-27 6 views
2

文字列が実際にオブジェクトであり、コンパイラがそうでないと言ったときに私のコードをコンパイルする際にエラーが発生する理由はわかりません。なぜこのエラーメッセージが表示され続けるのかわかりません。文字列はオブジェクトと見なされませんか?

symbol: method compareTo(Object) 
    location: variable least of type Object 
.\DataSet.java:17: error: cannot find symbol 
    else if(maximum.compareTo(x) < 0) 

ここにコードがあります。私は2つのオブジェクトがcompareToメソッドを使用できるように、クラスを比較可能にしようとしています。テスターでは、基本的な文字列オブジェクトを使って比較しようとしています。

public class DataSetTester 
{ 
public static void main(String[] args) 
{ 
    DataSet ds = new DataSet(); 
    String man = "dog"; 
    String woman = "cat"; 
    ds.add(man); 
    ds.add(woman); 
    System.out.println("Maximum Word: " + ds.getMaximum()); 


} 
} 

クラス:

public class DataSet implements Comparable 
{ 
private Object maximum; 
private Object least; 
private int count; 
private int answer; 

public void add(Object x) 
{ 

    if(count == 0){ 
    least = x; 
    maximum = x; 
    } 
    else if(least.compareTo(x) > 0) 
    least = x; 
    else if(maximum.compareTo(x) < 0) 
    maximum = x; 
    count++; 
} 

public int compareTo(Object anObject) 
{ 
    return this.compareTo(anObject); 
} 

public Object getMaximum() 
{ 
    return maximum; 
} 

public Object getLeast() 
{ 
    return least; 
} 
} 

Comparableインタフェース:

public interface Comparable 
{ 
    public int compareTo(Object anObject); 
} 
+0

あなたは* java.lang.Comparableとは異なる独自の* 'Comparable'クラスを実装していますか?私はあなたが 'Comparable'のために投稿したコードが汎用化された現代のjava.lang.Comparable'と非常に異なっているからです。 – Borealid

+2

短い答え:StringはObjectですが、Objectは必ずしもStringではありません。 ObjectはComparableを実装していないため、ObjectはcompareTo()できません。オブジェクトをストリングにキャストするか、ジェネリックを使用します。 – irrelephant

+0

@irrelephant:または単にComparable型として変数を宣言します。 –

答えて

4

DataSetComparableを実装していますが、Objectは実装していません。

Objectを保存する代わりに、Comparableを保存します。あなたはこれをコンパイルするために取得を行う場合は、あなたは右ここに無限ループになります:

public int compareTo(Object anObject) 
{ 
    // Yeah, never stop loopin'! 
    return this.compareTo(anObject); 
} 

を新しいコードでは、あなたは一般的なComparable<T>インタフェースを使用することをお勧めします。あなたのコードは次のようになります:

public class DataSet implements Comparable<DataSet> 
{ 
private String maximum; 
private String least; 
private int count; 
private int answer; 

public void add(String x) 
{ 

    if(count == 0){ 
    least = x; 
    maximum = x; 
    } 
    else if(least.compareTo(x) > 0) 
    least = x; 
    else if(maximum.compareTo(x) < 0) 
    maximum = x; 
    count++; 
} 

public int compareTo(DataSet anObject) 
{ 
    // I don't really know how you want this to work. 
    // Come up with your own criteria on what makes a DataSet greater or less than 
    // another one. 
    count - anObject.count 
} 

// Good practice to include this if you're doing a compareTo. 
@Override 
public boolean equals(Object other) 
{ 
    return (other instanceof DataSet) && compareTo((DataSet)other) == 0; 
} 

public String getMaximum() 
{ 
    return maximum; 
} 

public String getLeast() 
{ 
    return least; 
} 
} 

編集 - ちょうどあなたが文字列を比較しているのを見ました。その場合、Comparableを実装するのに実際にはDataSetは必要ありません。しかし、あなたが他の何かのためにそれを必要とするなら、私が書いたものはまだ立っています。

+0

これは私が必要とする答えは、このデータクラスがStringを介してテストされるComparableオブジェクトを受け入れることができるようにするために必要な答えのようです。この方法でうまくいくのでしょうか? – James

+0

少し変更して、 'DataSet'sの代わりに' String'sを追加しました。これはあなたが探していると思います。しかし、私はあなたが何をしようとしているのかまだよく分かりません。 基本的に、 'DataSet'がたくさんある場合は、' Comparable'を実装してください。 'DataSet'が' String'sの束をソートする場合、おそらく@ duffymoの解決策の行に沿って何かを探しているでしょう。 – parkovski

7

もちろん文字列オブジェクトです。

これは一般的なものです。なぜそれらがString型であれば、それらの参照を作成する必要があると感じますか?あなたのコードは悪いです。 Javaの問題ではありません。

DataSetがComparableを実装する必要がある理由がわかりません。あなたが追加されると、入って来る文字列を比較するだけです。このようにそれを行うと、あなたはより良い運賃う:

public class DataSet { 
    private String maximum; 
    private String least; 
    private int count; 
    private int answer; 

    public void add(String x) { 
     if(count == 0){ 
      least = x; 
      maximum = x; 
     } else if (least.compareTo(x) > 0) { 
      least = x; 
     } else if(maximum.compareTo(x) < 0) { 
      maximum = x; 
     } 
     count++; 
    } 

    public String getMaximum() { return this.maximum; } 

    public String getLeast() { return this.least; } 

    public int getCount() { return this.count; } 
} 
3
少なくとも

、最大値は単にオブジェクトであり、Objectクラスは、そのような単純なcompareTo(...)方法を、持っていません。最小値と最大値はObjectでなくComparableと宣言する必要があります。また、記述されているように、DataSetオブジェクトが存在せず、確かに比較されていないため、Comparableインターフェイスを実装するためにDataSetを宣言することは意味がありません。この方法は、継続的に自分自身を呼び出している

public int compareTo(Object anObject) 
{ 
    return this.compareTo(anObject); 
} 

:すべての

0

まず、あなたのコードで無限ループがあります。

コンパイルエラーについて:変数がObjectと宣言されていますが、明らかにcompareToメソッドがありません。

2

java.lang.ObjectにはcompareTo()メソッドがありません。

0

型チェックは実行時ではなくコンパイル時に行われます。コンパイル時に、最小値と最大値はString型ではなくObject型のオブジェクトと見なされます。

関連する問題