CodeBlanks Logo Icon CodeBlanks

Type erasure

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

Main.java
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

Main.java
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

Soru
List<String> strings = new Array____<>();
Cevap
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.

Orta seviye bölümündeki tüm dersler