2011-04-05 8 views
8

¿Cómo es que no hay error de compilación al enumerar el número en la lista? Pensé que los tipos tenían que ser relacionados.Reparto de referencia explícito de Java

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

Su clase de número, ¿es del paquete java.lang? – secmask

Respuesta

9

Sólo una conjetura, pero creo que tiene algo que ver con m siendo una referencia de interfaz. Si lo cambia a ArrayList m = new ArrayList();, muestra un error de tiempo de compilación.

Pensé que los tipos tenían que ser relacionados.

El número es una clase (resumen) y List es una interfaz para que puedan relacionarse a través de otra clase.

por lo que técnicamente podría tener

class Foo extends Number implements List 
{ 
    ... 
} 

y

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

podría ser legal y se quedará sin excepción si k está apuntando a un tipo compatible con Foo.

Por lo tanto, si hace referencia a un objeto por una interfaz, la resolución se aplaza hasta el tiempo de ejecución.

+2

Eso tiene sentido. –

+0

debería ser 'clase MyFooImpl extiende MyFoo {}' en lugar de 'clase MyFooImpl {}'? De todos modos, todos los errores de tiempo de compilación son cuando la asignación es una referencia de tipo de clase. –

+0

Encontré un comportamiento similar al trabajar con C#. –