make tablicaList.toArray () zwraca bardziej szczegółowe typy
189
Tak więc normalnie ArrayList.toArray()zwróciłby rodzaj Object[].... ale przypuszczam, że jest to
Arraylistobiekt Custom, jak zrobić, aby toArray()zwrócić rodzaj Custom[]zamiast Object[]?
Istnieją 2 metody o tej samej nazwie „toArray ()” w ArrayList. Począwszy od 1.5, druga metoda przyjmuje tablicę maszynową. Szukasz rozwiązania dla wersji wcześniejszych niż 1.5?
AFAIK: Ma to coś wspólnego z Javą jako całością, ponieważ nie jest w stanie używać ogólnych konstruktorów. Więc chociaż wie, że potrzebujesz go do konwersji obiektu takiego jak String [] lub MyObject [], nie może utworzyć go samodzielnie.
Co jeśli zamiast String chcemy użyć double? Wygląda na to, że zawodzi ... Możemy użyć Double, ale co jeśli chcę podwójne?
Pixel
2
@pbs Nie możesz. Ogólne elementy języka Java obsługują tylko typy referencyjne, a nie podstawowe. Auto-boxowanie / rozpakowywanie powinno jednak w większości przypadków ignorować różnicę między nimi.
solarshado
16
Tak naprawdę nie musi zwracać Object[], na przykład:
Mam odpowiedź ... wydaje się, że działa idealnie dobrze
publicint[] test (int[]b ){ArrayList<Integer> l =newArrayList<Integer>();Object[] returnArrayObject = l.toArray();int returnArray[]=newint[returnArrayObject.length];for(int i =0; i < returnArrayObject.length; i++){
returnArray[i]=(Integer) returnArrayObject[i];}return returnArray;}
Co jeśli mamy ArrayList <Animal> i zawiera ona typy psów i kotów, które rozszerzają Animal? Wygląda na to, że zawiódłby, gdyby pierwszym elementem był Pies, a następnym Cat. Widzi pierwszy element, tworzy tablicę typu Pies, dodaje psa, a następnie próbuje dodać kota i kończy się niepowodzeniem. Również może nie działać z generycznym E.
Odpowiedzi:
Lubię to:
Przed Java6 zalecono napisanie:
ponieważ wewnętrzna implementacja i tak realokuje tablicę o odpowiednim rozmiarze, więc lepiej zrobić to z góry. Ponieważ Java6 jest preferowana, pusta tablica jest preferowana, patrz .toArray (nowa MyClass [0]) lub .toArray (nowa MyClass [myList.size ()])?
Jeśli twoja lista nie jest poprawnie wpisana, musisz wykonać rzutowanie przed wywołaniem Array. Lubię to:
źródło
Tak naprawdę nie musi zwracać
Object[]
, na przykład:Oto moja
Custom
klasa: -źródło
http://download.oracle.com/javase/7/docs/api/java/util/ArrayList.html#toArray%28java.lang.Object[]%29
źródło
Mam odpowiedź ... wydaje się, że działa idealnie dobrze
źródło
Próbki:
źródło