2012-07-31 80 views
6

我还没有看到这个确切的问题,这让我感到惊讶。为什么我不能在if语句内部投射对象?

以下不会编译:

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警告我缺少括号和缺少分号......)

+0

if(this.order <((Category)o).order) – Joel 2012-07-31 17:02:45

+0

*有*缺少括号。 – EJP 2012-07-31 23:23:10

+0

@EJP对,但没有缺少分号。这既是我应该关注它的证据,也是这些信息可能不可靠的证据。 – BlackVegetable 2012-08-01 14:13:55

回答

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

这应该是允许的,它好像你的括号可能会关闭:你尝试过类似

如果(this.order <(((类别)O).order) )

1

我认为你需要这样的:

(((Category) o).order) 

我只是想你有什么简单的版本:

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

它编译得很好。

1

有您发布的两段代码之间的明显差异:

(Category o) 

比不同:

(Category)o 

这首先就不能编译,第二个会。

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梯形式)因为你是内if

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

@BlackVegetable有一件事更多没有必要有'else',因为你在'if'内有'return' – 2012-08-01 02:28:59

3

return我喜欢的语法

Category.class.cast(o) 

那么你明确你在做什么,它可以避免任何与括号混淆。从我的理解上面是((类别)o)

+0

啊哈!任何人都可以验证这是正确的吗?我非常喜欢这种语法! – BlackVegetable 2012-07-31 17:13:12

+3

那么,他们肯定会编译成不同的代码。两者都包含一个checkcast,但'Category.class.cast(o)'方法也会将'Category.class'推入堆栈,然后有'invokevirtual'。换句话说,'.class'方法具有演员方法的一切,加上一些。这会对性能产生多大影响,我不知道(我猜可以忽略不计)。 http://pastebin.com/7VRtfX5j – yshavit 2012-07-31 17:22:23

相关问题