JAVA-Jak znaleźć typ jaki lista przechowuje?

0

Pytanie tak jak w temacie, oddaje listę jako argument do metody statycznej i potrzebuje dowiedzieć się jakiego typu zmienne przechowuje. Dodam, że lista jest pusta więc sprawdzanie typu pierwszego elementu odpada. Szukałem na forach anglojęzycznych ale niestety nie znalazłem sadysfakcjonującej odpowiedzi, gdzieś wyczytałem że się nie da ale wydaje mi się to niemożliwe żeby java nie miała takich możliwości.

0

W momencie wywołania funkcji lista już istnieje, musi, ale jeszcze niczego nie przechowuje, jest to linked list jeżeli ma to jakieś znaczenie, lecz wątpie. Z przekazaniem dodatkowe argumenty, a mianowicie klasy elementów przechowywanych w tablicy świetnie mi działa, ale to jest takie rozwiązanie łopatologiczne, po co dodatkowy argument jeżeli moja informacja krąży gdzieś w programie. poza tym jeżeli oddaje dodatkowy argument to jest kolejne miejsce gdzie program może się wykrzaczyć np. przez podanie niewłaściwej klasy, no po prostu problem redundancji danych.

1

Typy generyczne są usuwane w czasie kompilacji. Zatem nie można w prosty sposób uzyskać pewnej informacji na temat tego, jakiego typu obiekty przechowujesz w liście. Szczególnie jest to niemożliwe w przypadku gdy lista przekazywana jest jako parametr metody (w javie mamy metody, nie funkcje). Informację tego rodzaju można wyciągnąć za pomocą refleksji, ale jedynie gdy mamy do czynienia z polem, klasą, albo metodą, która przyjmuje albo zwraca typ generyczny (<T> T metoda(T t)).

Zresztą szybki kodzik:

public class TypListy {

    public static void main(String[] args) throws NoSuchMethodException {
        List<String> stringi = new LinkedList<>();
        List<Integer> integers = new LinkedList<>();

        jakiTyp(stringi);
        jakiTyp(integers);
    }

    private static void jakiTyp(List stringi) throws NoSuchMethodException {
        Type[] jakiTyps = TypListy.class.getDeclaredMethod("jakiTyp", List.class).getGenericParameterTypes();
        System.out.println(jakiTyps.length);
        System.out.println(jakiTyps[0]);
    }

}
0

Próbowałem użyć twojego rozwiązania, ale jako typ zwracało mi zawsze interface, więc skopiowałem kod i wstawiłem prosto do kompilatora i niestety to samo również wyświetliło mi interface. Czy muszę zrobić jeszcze coś dodatkowo, proszę o jeszcze trochę pomocy, może o czymś zapomniałeś. Byłbym bardzo wdzięczny za odpowiedź.

0

Ten kod to tylko przykład, że nie można wyciągnąć tego typu informacji w runtimie.

0

Aaa dobra rozumiem, dzięki za odpowiedz nieodpowiedz :)

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