7

ここでこの正確な質問を見たことがないので、驚いています。

以下はコンパイルされません。

public int compareTo( Object o )
{
    if ( this.order < ((Category o).order) )
    {
      return -1;
    }
    else if ( this.order > ((Category o).order) ) 
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

これを変更してオブジェクトをキャストし、その参照を条件ステートメントの外の新しいオブジェクトに保存すると、問題が修正されます。

Category cat = ( Category )o;
if ( this.order < cat.order )
// Etc...

私の質問は、なぜこの動作が Java で許可されていないのですか? (具体的には Java 5)

編集:ああ!皆さん、ありがとうございました。あいまいなエラー メッセージを表示する最新の IDE をくそくらえ。私はそれらを値引きし始めましたが、今回は何の役にも立ちませんでした。(Netbeans は、括弧の欠落とセミコロンの欠落の両方について私に警告していました...)

4

6 に答える 6

19

ここでの問題は、構文が正しくないことです。そのはず

public int compareTo( Object o )
{
    if ( this.order < ((Category) o).order )
    {
      return -1;
    }
    else if ( this.order > ((Category) o).order ) 
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
于 2012-07-31T17:01:48.900 に答える
3

私は構文を好む

Category.class.cast(o)

そうすれば、何をしているのかが明確になり、括弧との混乱を避けることができます。私の理解では、上記は ((Category) o) と同じです。

于 2012-07-31T17:10:30.743 に答える
1

投稿した 2 つのコード スニペットには明確な違いがあります。

(Category o)

は次のものとは異なります。

( Category )o

この最初のものはコンパイルされませんが、2 番目のものはコンパイルされます。

于 2012-07-31T17:07:33.783 に答える
1

これは許可する必要があります。括弧がオフになっているようです。次のようなことを試しましたか

if ( this.order < (((Category)o).order) )

于 2012-07-31T17:03:20.633 に答える
1

これが必要だと思います:

(((Category) o).order)

私はあなたが持っているもののより単純なバージョンを試しました:

int a = 5;
        if(4 < (double)a);

そしてそれはうまくコンパイルされました。

于 2012-07-31T17:05:24.847 に答える
1

内でのキャストの簡単な動作デモをご覧ください。if

int i;
float d = 10.5f;
if((i = (int) d) == 10){
//works
}

あなたのコードの問題は、if ( this.order < ((Category o).order) )その間違ったステートメントにあります

そのはずif ( this.order < ((Category) o).order)

編集:あなたの問題は解決しましたが、もう1つ追加のトッピング)、必要はありません(elseはしご形式returnif

public int compareTo( Object o )
{
    if ( this.order < ((Category) o).order )
    {
        return -1;
    }
    if ( this.order > ((Category) o).order ) 
    {
        return 1;
    }
    return 0;
}
于 2012-07-31T17:08:46.920 に答える