После тестирования случая, который вы разместили в своем вопросе, я подтверждаю, что вы не получите исключение, просто приведя обобщенное значение, как вы это сделали, настоящее приведение никогда не произойдет, пока вы не получите доступ к полю date
, проверьте следующий код:public class Main {
public static void main(String[] args) {
org.joda.time.LocalDate date = org.joda.time.LocalDate.now();
GenericDemoObject<org.joda.time.LocalDate> gdo = new GenericDemoObject<>();
gdo.date = date;
try {
serialize("GenericDemoObject.ser", gdo);
} catch (IOException | ClassNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
try {
GenericDemoObject<java.time.LocalDate> obj1 = (GenericDemoObject<java.time.LocalDate>) deserialize("GenericDemoObject.ser");//no exception
GenericDemoObject<String> obj2 = (GenericDemoObject<String>) deserialize("GenericDemoObject.ser");//no exception
LocalDate date1 = obj1.date;//The exception is thrown here
String date2 = obj2.date;//The exception is thrown here
} catch (ClassNotFoundException | IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
private static Object deserialize(String fileName) throws IOException, ClassNotFoundException {
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName))) {
return in.readObject();
}
}
private static void serialize(String fileName, Object object) throws IOException, ClassNotFoundException {
try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(fileName))) {
out.writeObject(object);
}
}
}
class GenericDemoObject<T> implements Serializable {
private static final long serialVersionUID = 1L;
T date;
@Override
public String toString() {
return date.getClass().getName() + ':' + date.toString();
}
}
Я надеюсь, что это отвечает на ваш вопрос.
Примечание: Повторное чтение комментариев, я думаю Antoniossss действительно ответил, нона самом деле не опубликовал это как ответ.