2011-04-05 89 views
8

爲什麼沒有編譯器錯誤將數字轉換爲列表?我認爲類型必須相關。Java明確參考鑄造

Number k = 10; 
List m = new ArrayList(); 
m = (List)k; 
+0

您的Number類是否來自java.lang包? – secmask 2011-04-05 03:33:02

回答

9

只是一個猜測,但我認爲它有事情做與m是一個接口引用。如果將其更改爲ArrayList m = new ArrayList();,則會顯示編譯時錯誤。

我認爲類型必須相關。

Number是一個類(抽象),List是一個接口,所以它們可以通過另一個類相關聯。

所以在技術上你可以有

class Foo extends Number implements List 
{ 
    ... 
} 

Number k = ... ; // 
    List m = new Foo(); 
    m = (List) k; 

可能是合法的,並沒有異常,如果k被指向與Foo兼容的類型將運行。

因此,如果您通過接口引用對象,則解析會延遲到運行時。

+2

這很有道理。 – 2011-04-05 02:27:11

+0

它應該是'class MyFooImpl擴展MyFoo {}'而不是'class MyFooImpl {}'嗎?無論如何,所有編譯時錯誤都是賦值給類類型引用的地方。 – 2011-04-05 16:53:41

+0

我發現了與C#一起工作的類似行爲。 – 2011-04-05 16:56:11