24 Temmuz 2018 Salı

Type Erasure

Örnek
Elimizde şöyle bir kod olsun.
public static <T> T handle(T val) {
  System.out.println("T");
  return val;
}

public static <T extends String> T handle(T val) {
  System.out.println("T extends String");
  return val;
}
Kod derlendikten sonra şu hale gelir.
public static Object handle(Object val) {
  System.out.println("T");
  return val;
}

public static String handle(String val) {
  System.out.println("T extends String");
  return val;
}
Örnek
Şu kod type erasure yüzünden derlenmez. Aslında amaç bazı Class tipinin kodlanmamasını sağlamak.
public class Publisher<T> {

  private static final Class[] SUPPORTED_CLASSES = new Class[]{T1.class, T2.class};

  public Publisher() {
    if(Arrays.asList(SUPPORTED_CLASSES).contains(T)) { // error: expression expected!
      System.out.println("Class not supported!");
    }
  }
}
Çünkü T'nin tipi çalışma esnasında yoktur. Yani
new Publisher<T1>
ile
new Publisher<T2>
arasındali farkı kaybederiz.

Çözüm
Düzeltmek için şöyle yaparız.
public Publisher(Class<T> clazz) {
  if(!SUPPORTED_CLASSES.contains(clazz)) {
    System.out.println("Class not supported!");
  }
}
Çözüm
Şöyle yaparız. Böylece sadece MyInterface'ten kalıtan sınıflar derlenebilir.
public class Publisher<T extends S, MyInterface>

Hiç yorum yok:

Yorum Gönder