Type erasure
- Java kursu
- Orta seviye
- Ders 86/116
- 5 dk
Derleme sonrası tür silmeyi öğrenirsin.
Type erasure nedir?
Java generic'leri derleme zamanında denetlenir; runtime'da tür bilgisi silinir. Buna type erasure denir. List<String> ve List<Integer> derleme sonrası aynı List sınıfına dönüşür.
Bu yüzden new ArrayList<String>().getClass() ile new ArrayList<Integer>().getClass() aynı sonucu verir. Runtime'da generic tür parametreleri yoktur; yalnızca raw tür çalışır. Bu, JVM ile geriye dönük uyumluluk için tasarlanmıştır.
Erasure sınırlamaları
Type erasure bazı şeyleri engeller. Runtime'da (obj instanceof List<String>) yazamazsın; yalnızca (obj instanceof List<?>) veya (obj instanceof List) geçerlidir. Ayrıca new T() ile generic türden örnek oluşturamazsın.
Generic dizi de oluşturulamaz: new List<String>[10] yasaktır. Bunlar erasure'ın doğrudan sonucudur; tür parametresi runtime'da bilinmediği için JVM doğru denetimi yapamaz. Bu sınırları aşmak için Class<T> token ya da List<List<String>> gibi iç içe koleksiyon kullanılır.
Uygulama Type erasure'ı göster
main içinde List<String> strings = new ArrayList<>(); ve List<Integer> numbers = new ArrayList<>(); oluştur. İki getClass() çağrısını == ile karşılaştırıp sonucu System.out.println(strings.getClass() == numbers.getClass()); ile yazdır.
Başlangıç kodu
import java.util.ArrayList;
import java.util.List;
// İki farklı List<T> örneği oluştur
// getClass() karşılaştırması ve printlnÖrnek çözüm
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
List<Integer> numbers = new ArrayList<>();
System.out.println(strings.getClass() == numbers.getClass());
}
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 ArrayList örneğini tamamla
List<String> strings = new Array____<>();
List<String> strings = new ArrayList<>();
Açıklama: ArrayList, List arayüzünün standart uygulamasıdır.
2 Type erasure kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
type erasure |
Tür bilgisinin silinmesi |
getClass() |
Runtime türünü verir |
<T> |
Compile-time bilgisi |
raw type |
Tür parametresiz hali |
3 Type erasure nedeniyle hangisi yasaktır?
- List<Integer> bildirmek
- new T() ile generic tür örneği oluşturmak Doğru cevap
- Generic metot çağırmak
- Generic sınıf tanımlamak
Açıklama: new T() runtime'da T bilinmediği için yasaktır.