Açıklaması şöyle. Derleme hatası almasak bile çalışma esnasında exception fırlatılması sıkça görülen bir olay
ÖrnekThe 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.
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.
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