Sobes.tech
Middle+

Омӯзиши барномаро дар вақти иҷро кардан мумкин аст ба навъи генерик дастрасӣ пайдо кард?

sobes.tech AI

Ҷавоб аз AI

Не, мумкин нест. Маълумоти дар бораи навъи генерик дар вақти компиляция тоза мешавад (type erasure). Дар вақти иҷро танҳо навъҳои "хом" дастрасанд.

Масалан:

List<String> strings = new ArrayList<>();
// Дар вақти иҷро ин маълумот нобуд мешавад:
// type erasure

Аз ҳамин сабаб, коди зерин намебарояд, ки интизор меравад:

if (list instanceof List<String>) { // Хатои компиляция ё огоҳӣ
    // Ин код ҳамчун санҷиши List<String> кор намекунад
}

Мушаххасоти дар бораи навъи генерикро метавон бо рефлексия дастрас кард, аммо танҳо дар ҳолатҳои муайян, масалан, вақте ки бо майдонҳо, усулҳо ё сигнатураҳои синфҳо кор мекунед, ки дар манбаъӣ равшан нишон дода шудаанд.

Масалан, гирифтани навъи коллексияи аз майдон:

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(); // Гирифтани Type, ки маълумот дар бораи <>

        if (genericType instanceof ParameterizedType) { // Санҷидани он, ки навъи параметризатсияшуда аст
            ParameterizedType parameterizedType = (ParameterizedType) genericType;
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Гирифтани аргументҳои навъ

            for (Type type : actualTypeArguments) {
                System.out.println("Навъи унсур: " + type.getTypeName()); // Натиҷа "java.lang.String"
            }
        }
    }
}

Аммо, гирифтани навъи унсури рӯйхати, ки динамикӣ сохта шудааст, аллакай имконнопазир аст:

List<Integer> intList = new ArrayList<>();
// Ин маълумот дар вақти иҷро нобуд мешавад

Дар контексти Android, ин махсусан муҳим аст, вақте ки бо китобхонаҳое кор мекунед, ки генерикҳоро истифода мебаранд, масалан, Retrofit барои парсинг кардани ҷавобҳо аз API. Онҳо одатан конструксияҳои TypeToken аз Guava ё аналогҳои он барои интиқоли маълумот дар бораи навъ дар вақти иҷро истифода мебаранд.

Масалан, истифодаи TypeToken (аз Guava):

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

Type listStringType = new TypeToken<List<String>>() {}.getType();
// Ин объект Type маълумот дар бораи List<String> дорад ва метавонад дар вақти иҷро истифода шавад