Rzutowanie w dół List

Rzutowanie w dół List
JE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

Nie rozumiem dlaczego ten kod się nie kompiluje.

Kopiuj
import java.util.ArrayList;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> test = (ArrayList<String>) Arrays.asList(args);
    }
}

Dostaję error java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

szarotka
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 556
1

No, bo takie parsowanie nie jest obsługiwane
Możesz to zrobić tak:

Kopiuj
List<String> test = Arrays.asList(args);
 

albo jeśli chcesz koniecznie mieć ArrayList a nie List

Kopiuj
 
ArrayList<String> test = new ArrayList<>();
test.addAll(Arrays.asList(args));
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Bo skad wiesz że Arrays.asList() zwraca akurat ArrayList a nie jakąś inną implementacje List? Zrób po ludzku
List<String> test = Arrays.asList(args);
i w ogóle generalnie staraj sie używać interfejsów a nie konkretnych klas jako referencji w kodzie

JE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 32
0

@Shalom
No spojrzałem w implementację (w intellij ctrl+b), a tam coś takiego jest.

Kopiuj
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

Więc myślałem, że mogę tak zrobić.
Skoro piszesz, że lepiej ten List to ok.

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

@Jerylee no dobra ale to jest implementacja akurat w tej javie której używasz. Skoro metoda zwraca List<T> to znaczy że developerzy danego JVMa mogą to zaimplementować dowolnie i zwracać tam listę dowolnego typu, niekoniecznie ArrayList :)

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
1

@Jerylee
Zwróć uwagę na to, że ta klasa ArrayList jest w rzeczywistości zaimplementowana w klasie Arrays. W pliku Arrays.java definicja tej klasy zaczyna się tak:

Kopiuj
private static class ArrayList<E>

A zapis typu java.util.Arrays$ArrayList standardowo mówi właśnie o klasie ArrayList zdefiniowanej wewnątrz klasy java.util.Arrays.

Poza tym, tak jak napisał Shalom, używaj interfejsu List jeżeli nie potrzebujesz metod dostępnych w podklasach. Podstawą programowania obiektowego jest używanie abstrakcji.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.