Я думаю, что здесь должно быть что-то тонкое, о котором я не знаю. Рассмотрим следующее:
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
и бросить его без проблем. Почему массивы нарушают это?
Спасибо.