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

这应该是允许的,似乎您的括号可能已关闭:您是否尝试过类似的东西

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

您发布的两个代码片段之间存在明显差异:

(Category o)

不同于:

( Category )o

第一个不会编译,第二个会。

于 2012-07-31T17:07:33.783 回答
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)

编辑:你的问题解决了,但还有一件事额外的浇头),不需要有else梯形return) ,因为你有if

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 回答