2011-04-05 96 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