为什么我不能在if语句中转换对象?

时间:2012-07-31 16:59:12

标签: java casting

我在这里没有看到这个确切的问题,这让我感到惊讶。

以下内容无法编译:

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)

编辑:啊哈!谢谢你们。 Darn现代IDE提供模糊的错误消息。我已经开始打折他们了,这次对我没什么好处。 (Netbeans警告我关于缺少括号和缺少分号......)

6 个答案:

答案 0 :(得分:17)

这里的问题是你的语法不正确。它应该是

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;
    }
}

答案 1 :(得分:3)

我更喜欢语法

Category.class.cast(o)

然后你明确你在做什么,它避免了与括号混淆。根据我的理解,上面与((Category)o)

相同

答案 2 :(得分:1)

这应该被允许,似乎你的括号可能是关闭的:你尝试过类似

的东西

if(this.order&lt;(((Category)o).order))

答案 3 :(得分:1)

我认为你需要这个:

(((Category) o).order)

我刚尝试了一个更简单的版本:

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

它编译得很好。

答案 4 :(得分:1)

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

(Category o)

不同于:

( Category )o

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

答案 5 :(得分: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

中的return
if