2013-05-21 15 views
14

Bir Java nesne dizisi oluşturmaya çalışıyorum ve diziyi ikinci dizinde (diziyle kendisiyle benzer bir fraktal göstermek için) yerleştirin, ancak theArray[1][1][0] erişmeye çalıştığımda, bu hatayı alıyorum:Bir Java dizisini kendi içine nasıl yerleştirebilirim?

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

Bu

şimdiye kadar denedim budur ve bunu niye işe yaramadığı emin değilim: Ben çalışılıyor gibi

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 
    } 
} 

kendisi içinde bir Java dizi koymak aslında mümkün mü burada mı

+0

İpucu yapabilirdi: haberlerini okuyun Java 'instanceof' operatör. Buna ihtiyacın olacak. –

+0

'((Object []) ((Object []) theArray [1] [1] [1]) [0]' kullanabilirdi :) –

+0

@ Eng.Fouad Bana herşeyi çökerttiğini gördüğüm bazı sapkınlıkları hatırlatıyor 'Object [] 'örnekleri içine, vahşi dizi serileriyle sonuçlanır; İlk görüşte kesinlikle biraz belirsiz. – Vulcan

cevap

19

theArray[1]derleme zamanında tip Object (bu nesneleri bir dizi geldiği için) göstermektedir.

Diziyi bir dizi olarak kullanmak için Object[]'a göndermeniz gerekir.


karşılaştığınız temel problem kendini içeren bir dizi mükemmel geçerli nesne olmasına rağmen, geçerli bir tip olmadığıdır.

Dizi türlerini keyfi olarak derinden yuvalayabilirsiniz – Object[][][][][][][][][][][][][] geçerli bir türüdür.
Ancak, türün "alt düzeyi" bir dizi olamaz.

dizisinin dizisi olan bir tür oluşturmaya çalışıyorsunuz. Generics'i kullanma
, bu mümkün olacaktır: Eğer Nesneler bir dizi olmaya theArray ilan ettik beri, bir döküm hatası yaşamaya devam edip

class Evil extends ArrayList<Evil> { } 
+0

Sağ. Nesne [] 'dizininin bir öğesi derleyiciye sadece bir' Nesne'dir. '(Object [])' cast işlemini kullanarak 'Object []' 'e atılması gerekir. Bu, derleyicinin gerçekte bir "Object []" olduğunu söyleyebilmeniz için bir çalışma zamanı denetimi oluşturmasına neden olur. –

+0

@HotLicks: Aslında, çalışma zamanı denetimi JITter'den geliyor, inanıyorum. – SLaks

+0

'System.out.println ((Object []) (TheArray [1]) [1] [0]);' aynı hatayı üretiyor gibi görünüyor. –

2

. Sonuç olarak, theArray[1]'un Array olduğunu iddia edemezsiniz - Object her türlü olabilir. Ne istediğini yapmak erişiminizi kırmaya gerekir:

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, bu asla (AFAIK?) Çökmeyecek. – SLaks

+0

Aynı dizi; asla bitmeyecek. Ayrıca, bellek veya yığın sızdırmaz. – SLaks

+0

@SLaks Bu neden tükenmez? Her iterasyon 'internalArray'ı kendi ikinci elemanına işaret eder ... farketmeden aptalca bir şey yapmazsam? –

1

Kodunuz

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

eşdeğerdir Ama

Object[] arr = (Object[]) theArray[1]; // Now it is an array 
İlgili konular