2013-05-21 13 views
14

Próbuję utworzyć tablicę obiektów Java i umieścić ją wewnątrz siebie w jej drugim indeksie (w celu reprezentowania samopodobnego fraktala z tablicą), ale gdy próbuję uzyskać dostęp do theArray[1][1][0], pojawia się następujący błąd:Jak mogę umieścić w sobie tablicę Javy?

Main.java:11: error: array required, but Object found.

To, co starałem tak daleko, i nie jestem pewien, dlaczego to nie działa:

import java.util.*; 
import java.lang.*; 

class Main 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 
     Object[] theArray = new Object[2]; 
     theArray[0] = "This array should contain itself at its second index."; 
     theArray[1] = theArray; //Now I'm attempting to put the array into itself. 
     System.out.println(theArray[1][1][0]) //Main.java:11: error: array required, but Object found 
    } 
} 

Czy to rzeczywiście możliwe, aby umieścić tablicę Java wewnątrz siebie, jak ja próbuje zrób tutaj?

+0

Podpowiedź: Poczytaj na Operator 'instanceof' Java. Będziesz tego potrzebował. –

+0

Możesz użyć '((Object []) ((Object []) theArray [1]) [1]) [0]' :) –

+0

@ Eng.Fouad To przypomina mi pewne zaciemnienie, które widziałem, że wszystko załamało w instancjach 'Object []', co skutkuje dziką serią rzutów; to na pewno jest trochę niejasne na pierwszy rzut oka. – Vulcan

Odpowiedz

19

theArray[1] jest kompilacji typu Object (ponieważ pochodzą z tablicy obiektów).

Musisz go przesłać do Object[], aby użyć go jako tablicy.


Podstawowym problemem jesteś napotykające jest, że chociaż tablicę, która zawiera się to doskonale ważny przedmiot, to nie jest ważne typ.

Można zagnieżdżać typy tablic dowolnie głęboko – Object[][][][][][][][][][][][][] jest prawidłowym typem.
Jednak "najniższy poziom" typu nie może być tablicą.

Próbujesz utworzyć typ, który jest tablicą o wartości sam w sobie.
Korzystanie rodzajowych, że byłoby to możliwe:

class Evil extends ArrayList<Evil> { } 
+0

Dobrze. Element twojej tablicy 'Object []' jest dla kompilatora po prostu 'Object'. Musi być rzutowany na 'Object []' przy użyciu operacji rzutowania '(Object [])'. Powoduje to, że kompilator generuje kontrolę środowiska wykonawczego, aby upewnić się, że rzeczywiście jest to "Object []" w taki sposób, w jaki się to mówi. –

+0

@HotLicks: Rzeczywiście, sprawdzanie czasu pracy pochodzi od JITter, jak sądzę. – SLaks

+0

'System.out.println ((Object []) (theArray [1]) [1] [0]);' wydaje się powodować ten sam błąd. –

2

używasz do błędu odlewania odkąd ogłosił theArray być tablicą obiektów. W rezultacie nie można obiecać, że JAVA theArray[1] jest Array - może to być dowolny rodzaj Object. trzeba zerwać dostęp do tego, co chcesz:

Object[] innerArray = (Object[]) theArray[1]; 
System.out.println(innerArray[0] == theArray[0]); // Always true since innerArray IS theArray 
while (true) { 
    // Careful! This loops forever! 
    // set innerArray = innerArray[1] = theArray = theArray[1] = innerArray... 
    // all of these are the exact same object (but you have to tell Java their type every time) 
    innerArray = (Object[]) innerArray[1]; 
    System.out.println(innerArray[0]); 
} 
+0

BTW, który nigdy się nie zawiedzie (AFAIK?). – SLaks

+0

To ta sama tablica; nigdy się nie skończy. Nie spowoduje to również wycieku pamięci ani stosu. – SLaks

+0

@SLaks Dlaczego to nie zabraknie? Każda iteracja ustawia 'innerArray', aby wskazywała na swój drugi element ... chyba że zrobiłem coś głupiego, nie zauważając? –

1

Twój kod jest równoważne

Object arr = theArray[1]; // arr is an Object here, not an array 

Ale można zrobić

Object[] arr = (Object[]) theArray[1]; // Now it is an array 
Powiązane problemy