8 Haziran 2021 Salı

Array İçin Covariant Nesne Atama - Covariance

Giriş 
Açıklaması şöyle. Derleme hatası almasak bile çalışma esnasında exception fırlatılması sıkça görülen bir olay
The main difference between arrays and generics is that arrays are covariant while generics are not. It means that Number[] is a supertype for Integer[]. And Object[] is a supertype for any array (except primitive ones). That seems logical, but it may lead to bugs at runtime.
Örnek
Elimizde şöyle bir kod olsun. Derleme hatası almasak bile farklı tipten bir nesne atamaya kalkarsak ArrayStoreException alırız.
Number[] nums = new Long[3];
nums[0] = 1L;
nums[1] = 2L;
nums[2] = 3L;
Object[] objs = nums;
objs[2] = "ArrayStoreException happens here";
Açıklaması şöyle
This code does compile but it throws an unexpected exception.
Eğer Generic kullansaydık derleme hatası alırdık
List<Number> nums = new ArrayList<>();
List<Long> longs = new ArrayList<>();
nums = longs; // compilation error
Örnek - Kalıtan Tipten Array'a Cast Etme
B tipinden nesne içeren A tipinden dizi, B tipinden diziye cast edilemez. Aslında derleniyor ancak çalışma zamanında exception fırlatır.
Örnek
Elimizde şöyle bir kod olsun.
public static class A { }
public static class B extends A { }

public static void main(String [] args) {
  A[] a = new A[100];
  for (int i = 0; i < a.length; i++) {
    a[i] = new B();
  }
  B[] b = (B[]) a;  /* Error: ClassCastException, even if all elements are of type B */
}

Hiç yorum yok:

Yorum Gönder