Sobes.tech
Middle+

Vai ir iespējams piekļūt ģeneriskā tipa laikā programmas izpildes laikā?

sobes.tech AI

Atbilde no AI

Nē, tas nav iespējams. Ģeneriskā tipa informācija tiek dzēsta kompilācijas laikā (type erasure). Vykdīšanas laikā pieejami ir tikai "neapstrādāti" tipi.

Piemēram:

List<String> strings = new ArrayList<>();
// Vykdīšanas laikā šī informācija tiks zaudēta:
// type erasure

Tādēļ šāds kods nesīs gaidīto rezultātu:

if (list instanceof List<String>) { // Kompilācijas kļūda vai brīdinājums
    // Šis kods nedarbosies kā List<String> pārbaude
}

Informāciju par ģeneriskā tipa tipu var iegūt, izmantojot refleksiju, bet tikai noteiktos gadījumos, piemēram, strādājot ar laukiem, metodēm vai klases signatūrām, kur tips ir skaidri norādīts avota kodā.

Piemērs, kā iegūt kolekcijas tipu no lauka:

import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

public class MyClass {
    List<String> stringList;

    public static void main(String[] args) throws Exception {
        Field field = MyClass.class.getDeclaredField("stringList");
        Type genericType = field.getGenericType(); // Iegūstam Type, kas satur informāciju par <>

        if (genericType instanceof ParameterizedType) { // Pārbaudām, vai tips ir parametrizēts
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Iegūstam tipu argumentus

            for (Type type : actualTypeArguments) {
                System.out.println("Elementa tips: " + type.getTypeName()); // Izvadīs "java.lang.String"
            }
        }
    }
}

Bet iegūt elementa tipu no dinamiski izveidotas saraksta vairs nav iespējams:

List<Integer> intList = new ArrayList<>();
// Šeit informācija par Integer tiek zaudēta runtime laikā

Android kontekstā tas ir īpaši svarīgi, strādājot ar ģeneriskām bibliotēkām, piemēram, Retrofit API atbilžu parsēšanai. Tur bieži tiek izmantotas konstrukcijas kā TypeToken no Guava vai tā analogi, lai nodotu informāciju par tipu runtime laikā.

Piemērs, kā izmantot TypeToken (no Guava):

import com.google.common.reflect.TypeToken;
import java.util.List;

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Šis Type objekts satur informāciju par List<String> un to var izmantot runtime laikā