Sobes.tech
Middle+

Proqramın icrası zamanı generik növünə daxil olmaq mümkündürmü?

sobes.tech Süni İntellekt

AI-dan cavab

Xeyr, mümkün deyil. Növü ümumi olan məlumatlar tərtib zamanı silinir (type erasure). Yalnız "xam" növlər işləmə zamanı mövcuddur.

Məsələn:

List<String> strings = new ArrayList<>();
// İşləmə zamanı bu məlumat itəcək:
// type erasure

Bu səbəbdən, aşağıdakı kod gözlənildiyi kimi işləməyəcək:

if (list instanceof List<String>) { // Tərtib xətası və ya xəbərdarlıq
    // Bu kod List<String> yoxlaması kimi işləməyəcək
}

Generik növ haqqında məlumatı refleksiya vasitəsilə əldə etmək mümkündür, lakin yalnız müəyyən hallarda, məsələn, sahələr, metodlar və ya sinif imzalarında növ açıq şəkildə göstərilibsə.

Sahədən kolleksiya növünü alma nümunəsi:

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(); // <>'li məlumatı ehtiva edən Type

        if (genericType instanceof ParameterizedType) { // Növün parametrli olub-olmadığını yoxlayırıq
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Növ arqumentləri

            for (Type type : actualTypeArguments) {
                System.out.println("Element növü: " + type.getTypeName()); // "java.lang.String" göstərəcək
            }
        }
    }
}

Ancaq dinamik şəkildə yaradılmış siyahının element növünü almaq mümkün deyil:

List<Integer> intList = new ArrayList<>();
// Burada Integer haqqında məlumat işləmə zamanı itir

Android kontekstində, bu xüsusilə Retrofit kimi kitabxanalarla işləyərkən vacibdir, çünki onlar generik istifadə edir və TypeToken kimi quruluşlardan istifadə etməklə növ məlumatını işləmə zamanı ötürürlər.

TypeToken istifadə nümunəsi (Guava-dan):

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

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Bu Type obyekti List<String> haqqında məlumatı ehtiva edir və işləmə zamanı istifadə oluna bilər