2010-02-23 18 views
7

Necesito saber qué clase de matrices multidimensionales en Java se extiende exactamente?Las matrices multidimensionales en Java extienden qué clase?

Cuando asignamos

Object[] ref=new int[]{1,2,3}; 

el compilador se queja de que los objetos son de diferentes tipos. Por lo tanto, parece que las matrices de una dimensión extienden Object; Ya lo se.

Pero cuando asignamos

Object[] ref2=new int[][]{{1,2,3},{4,5,6}}; 

el compilador no se quejará. Por lo tanto, parece que las matrices bidimensionales se extienden Object[].

Pero al imprimir su nombre superclase:

System.out.println(ref2.getClass().getSuperclass().getName()); 

llegué java.lang.Object.

Entonces, ¿alguien puede explicar lo que está pasando aquí?

Respuesta

13

Una matriz multidimensional en Java es en realidad una matriz de matrices (de matrices) *.

Además, las matrices se consideran subclases de Object.

lo tanto, su int[][] es un Object[] (con tipo de componente int[]), y también un Object (porque todas las matrices son objetos)

Un int[] sin embargo, no es un Object[] (pero sigue siendo un Object).

lo que parece que matrices de dos dimensiones se extienden Object []

No estoy seguro de si es "extender" es la palabra adecuada aquí. Las matrices tienen un lugar especial en el sistema de tipo Java, y funcionan un poco diferente de otros objetos. Una matriz bidimensional es definitivamente un Objeto []. Pero si pregunta por superclases, la única superclase que tiene cualquier tipo de matriz es Object. Todas las matrices también son clonables y serializables.

+1

mejor su enunciado de mi respuesta. +1 –

+0

@mmyers: +1 por eliminar su respuesta a favor de la votación ascendente de una que pensó que era mejor (o tan buena y anterior). ¡Ojalá más de nosotros hiciéramos eso! –

+0

Si continuamos int [] [] [] es un Objeto [] [], por lo que es una característica amable en el lenguaje Java, y no hay jerarquía de Clase para estas matrices. – skystar7

3

Su árbol de herencia es como la siguiente:

  1. REF2 is-aint[][]
  2. REF2 se -unObject[]
  3. REF2 se -unObject

Aquí hay un código fragmento que ilustra lo que quiero decir:

Object ref2 = new int[][]{{1,2,3}, {4,5,6}}; 
System.err.println("ref2: " + (ref2 instanceof int[][]) + 
    " " + (ref2 instanceof Object[])); 

Debería ver algo como:

ref2: true true 
2

Arrays en Java son covariantes. Esto significa que TSub[] es un subtipo de TSuper[] si TSub es un subtipo de TSuper.

Tiene int[][] que es una matriz de int[]. Ahora, como han señalado otros, cualquier matriz en Java es un subtipo de Object, por lo que int[] es un subtipo de Object. Por lo tanto, debido a la covarianza de matriz, int[][] es un subtipo de Object[] (sustituye TSub = int[] y TSuper = Object en la definición anterior de covarianza).

Editar - Para que sea más claro por qué covarianza es importante en este caso, tenga en cuenta que al hacer lo mismo con List<T> no funcionaría:

List<Object> ref2 = new List<int[]>() 
+0

-1 su explicación es confusa - 'int' no hereda directamente de' Object' – thecoop

+0

No dije que sí - int [] (array of int) sí. –

1

Cuando asignamos

Object[] ref=new int[]{1,2,3}; 

el compilador se queja

Eso es porque int no es un subtipo de Object, int.class.getSuperclass() devuelve null. Recuerde que en Java, los valores primitivos (ints, longs, doubles, ...) no son objetos.

Parece que las matrices bidimensionales extienden Object [].
Pero al imprimir su nombre superclase:

System.out.println(ref2.getClass().getSuperclass().getName()); 

llegué java.lang.Object.

Las matrices son más como las interfaces, como lo hacen la herencia múltiple. Pero no son interfaces reales, en el sentido de una interfaz Java.

class A {} 
interface I {} 
class B extends A implements I {} 


B[][] bArray = new B[1][1]; 
System.out.println(bArray instanceof A[][]); 
System.out.println(bArray instanceof I[][]); 
System.out.println(bArray instanceof Object[]); 
System.out.println(bArray.getClass().getSuperclass()); 
for (Class i: bArray.getClass().getInterfaces()) 
    System.out.println(i); 
System.out.println(I[][].class.isAssignableFrom(bArray.getClass())); 
System.out.println(I[][].class.isInstance(bArray)); 

Salida:

true 
true 
true 
class java.lang.Object 
interface java.lang.Cloneable 
interface java.io.Serializable 
true 
true 

Además, Java viola el principio de sustitución Liskov, porque

B[] bArray = new B[1]; 
A[] aArray = bArray; 
// bArray[0] = new A(); // causes a compile error 
aArray[0] = new A(); // compiles, but causes runtime exception 
Cuestiones relacionadas