2012-07-31 96 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

相關問題