Rzutowanie w dół List

0

Nie rozumiem dlaczego ten kod się nie kompiluje.

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

1

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

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

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

 
ArrayList<String> test = new ArrayList<>();
test.addAll(Arrays.asList(args));
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

0

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

    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.

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 :)

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:

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1