2013-03-09 10 views
7

W moim kodu java, staram się zbudować listę ArrayList, mój kod wygląda następująco,[Ljava.lang.Object; nie można rzucić na [Ljava.util.ArrayList;

private ArrayList<Integer>[] listoflist; 
listoflist = (ArrayList<Integer>[]) new Object[875715]; 

Jednak, kiedy kompilacji kodu, kompilator powtarza, że ​​

[Ljava.lang.Object; nie można rzucić na [Ljava.util.ArrayList;

Mogę zapytać, dlaczego nie mogę rzucić Object [] do ArrayList []?

+8

Dlaczego miałbyś * oczekiwać * możliwości? –

+4

Ponieważ próbujesz rzucić sparametryzowany typ: 'Object', do sparametryzowanego typu:' ArrayList '. – Rob

+0

A czego się spodziewać? –

Odpowiedz

4

Mówiłeś, że starasz się budować lista ArrayLists. Ale ... próbujesz użyć tablicy, aby to zrobić ... Dlaczego po prostu użyć innej tablicy ArrayList? To rzeczywiście bardzo proste:

private List<List<Integer>> listoflist = new ArrayList<ArrayList<Integer>>(); 

Oto przykład użycia go:

ArrayList<Integer> list1 = new ArrayList<Integer>(); 
list1.add(Integer.valueOf(3)); 
list1.add(Integer.valueOf(4)); 
ArrayList<Integer> list2 = new ArrayList<Integer>(); 
list2.add(Integer.valueOf(6)); 
list2.add(Integer.valueOf(7)); 
listoflist.add(list1); 
listoflist.add(list2); 

Mówiąc ArrayList<ArrayList<Integer>> tak wiele razy, to trochę dziwne, więc w Javie 7 budowa może być tylko new ArrayList<>(); (to wnioskuje typ ze zmiennej, do której ją przypisujesz).

+0

dziękuję, świetna odpowiedź! – Bpache

4

Java to strong typed language - dlatego nie można po prostu rzucić jednego typu na drugi. Jednak można je konwertować.

W przypadku Object[] do List prostu użyć

Object[] arr = new Object[]{...}; 
List<Object> list = Arrays.asList(arr); 

a jeśli chcesz go używać jako ArrayList, na przykład jeśli chcesz dodać kilka innych elementów, po prostu zawinąć go ponownie

ArrayList<Object> arrList = new ArrayList<Object>(Arrays.asList(arr)); 
+0

dziękuję bardzo. – Bpache

-2

zdefiniować go w jednej linii jak następujące, kompilator nie skarżą

private ArrayList[] listoflist = (ArrayList<Integer>[]) new Object[10]; 
+2

Mylisz się, to jest dokładnie to samo zdanie, ale napisane inaczej, z tym samym ostrzeżeniem: 'Wpisz bezpieczeństwo: Niezaznaczone rzutowanie z Object [] do ArrayList []', i ten sam błąd: '[Ljava.lang.Object ; nie można rzutować na [Ljava.util.ArrayList; ' – Rob

+0

@Rob: understand. Ale kiedy próbowałem zrobić to zaćmienie, to dawało błąd. Ale po jednej linii ostrzega, o której wspomniałeś. – AmitG

1

Możesz utworzyć n-wymiarową ArrayList, podobnie jak n-dimensionaly Array, umieszczając ArrayLists w ArrayLists.

Oto przykład z 3 wymiarami pokazującymi koncepcję.

public static void main(String args[]){ 
    ArrayList<ArrayList<ArrayList<Integer>>> listOfListOfList = new ArrayList<ArrayList<ArrayList<Integer>>>(); 
    int firstDimensionSize = 3; 
    int secondDimensionSize = 4; 
    int thirdDimensionSize = 5; 

    for (int i = 0; i < firstDimensionSize; i++) { 
     listOfListOfList.add(new ArrayList<ArrayList<Integer>>(vertices)); 
     for (int j = 0; j < secondDimensionSize; j++) { 
      listOfListOfList.get(i).add(new ArrayList<Integer>()); 
      for(int k = 0; k < thirdDimensionSize; k++) { 
       listOfListOfList.get(i).get(j).add(k); 
      } 
     } 
    } 
} 

pamiętać, że można opuścić <> pusty po nowym ArrayList <>. Java będzie wnioskować o typie (bez względu na sposób zagnieżdżenia), ponieważ java 7 wierzę. Po prostu zapisałem je w przykładzie, aby pokazać, jakiego typu używasz na każdym poziomie, aby przykład był bardziej przejrzysty. Nadal można je zapisać, aby kod był bardziej czytelny.

Powiązane problemy