Обобщения, массивы и исключение ClassCastException
Я думаю, что здесь должно быть что-то тонкое, о чем я не знаю. Учтите следующее:
public class Foo<T> {
private T[] a = (T[]) new Object[5];
public Foo() {
// Add some elements to a
}
public T[] getA() {
return a;
}
}
Предположим, что ваш основной метод содержит следующее:
Foo<Double> f = new Foo<Double>();
Double[] d = f.getA();
Вы получитеCastClassException
с сообщениемjava.lang.Object
не может быть приведен кjava.lang.Double
.
Кто-нибудь может сказать мне, почему? Мое пониманиеClassCastException
заключается в том, что он выбрасывается при попытке привести объект к типу, который не может быть приведен. То есть для подкласса, экземпляром которого он не является (цитируя документацию). например.:
Object o = new Double(3.);
Double d = (Double) o; // Working cast
String s = (String) o; // ClassCastException
И, кажется, я могу это сделать. Еслиa
был простоT
вместо массиваT[]
, мы можем получитьa
и бросить его без проблем. Почему массивы ломают это?
Благодарю.