Я пытаюсь использовать Class.cast(), чтобы преобразовать коробочная Double к примитиву двойной:Java не может отливать из коробочного типа примитивного типа
Object d = 1.0d;
Class<?> clazz = double.class;
//the bellow line throws java.lang.ClassCastException:
//Cannot cast java.lang.Double to double
clazz.cast(d);
Я делаю это потому, что в какой-то части моего кода , объект значения и класс задаются динамически, и у меня есть гарантия того, что объект значения имеет совместимый тип. Но это исключение действительно смущает меня. Каков контракт с использованием cast()?
UPDATE Я побежал в это, потому что у нас есть такой код:
interface Provider <T> {
T get();
Class<T> getClazz();
}
//a special handling for double primitive
class DoubleProvider implements Provider<Double> {
public double getDouble(){
return 1.0d;
}
@Override
public Double get() {
return getDouble();
}
@Override
public Class<Double> getClazz() {
//why this actually compiles?
return double.class;
}
}
Если двойной и двойной настолько различны, что они не считаются назначаемые в ни способов, почему Java позволяет метод getClazz() в DoubleProvider для компиляции? Какова связь между double.class и Double.class?
Вы не можете отнести класс-оболочку к примитиву таким образом. Автобоксинг и кастинг [не то же самое] (http://stackoverflow.com/questions/501653/java-whats-the-difference-between-autoboxing-and-casting). – azurefrog