Dastur bajarilayotganda generik turiga kirish mumkinmi?
sobes.tech AI
AIdan javob
Yo'q, mumkin emas. Generik tur haqida ma'lumotlar kompilatsiya vaqtida o'chiriladi (type erasure). Faqat "xom" turlar mavjud bo'ladi va ishlash vaqtida mavjud bo'ladi.
Misol uchun:
List<String> strings = new ArrayList<>();
// Ishlash vaqtida bu ma'lumotlar yo'qoladi:
// type erasure
Shuning uchun, quyidagi kod kutganingizdek ishlamaydi:
if (list instanceof List<String>) { // Kompilatsiya xatosi yoki ogohlantirish
// Bu kod List<String> tekshiruvi sifatida ishlamaydi
}
Generik tur haqida ma'lumotga refleksiya orqali kirish mumkin, lekin faqat ma'lum holatlarda, masalan, maydonlar, metodlar yoki sinf imzolarida tur aniq ko'rsatilgan bo'lsa.
Maydonlardan kolleksiya turini olish misoli:
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 ma'lumotlarni o'z ichiga olgan Type
if (genericType instanceof ParameterizedType) { // Tur parametrlanganligini tekshirish
ParameterizedType parameterizedType = (ParameterizedType) genericType;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); // Argumentlarni olish
for (Type type : actualTypeArguments) {
System.out.println("Element turi: " + type.getTypeName()); // "java.lang.String" chiqaradi
}
}
}
}
Ammo, dinamik tarzda yaratilgan ro'yxatning element turini olish mumkin emas:
List<Integer> intList = new ArrayList<>();
// Bu yerda Integer haqida ma'lumot ishlash vaqtida yo'qoladi
Android kontekstida, bu ayniqsa, Retrofit kabi kutubxonalar bilan ishlashda muhim, chunki ular generiklardan foydalanadi va TypeToken kabi konstruktsiyalar yordamida tur ma'lumotlarini ishlash vaqtida uzatish mumkin.
TypeToken dan foydalanish misoli (Guava):
import com.google.common.reflect.TypeToken;
import java.util.List;
Type listStringType = new TypeToken<List<String>>() {}.getType();
// Bu Type obyekti List<String> haqida ma'lumotni o'z ichiga oladi va ishlash vaqtida foydalanilishi mumkin