我有 3 節課:
BaseNotification {}
ManagerNotification extends BaseNotification {}
NotificationWrapper<T extends BaseNotification> {
private T message
}
List<NotificationWrapper<ManagerNotification>>投射到List<NotificationWrapper<?>>(or )的最佳方式是什么List<NotificationWrapper<? extends BaseNotification>>?
我也想避免未經檢查的鑄造警告。
uj5u.com熱心網友回復:
這是一個示例,為什么您不能根據您的示例擴展泛型型別的型別:
StaffNotifcation extends BaseNotification {}
List<NotificationWrapper<ManagerNotification>> list = new ArrayList<>();
list.add(new NotificationWrapper<>(new ManagerNotification()); // <- contructor taking T implied for NotificationWrapper
list.add(new NotificationWrapper<>(new StaffNotification()); // <- fails because StaffNotfication != ManagerNotification
List<NotificationWrapper<?>> castList = (List<NotificationWrapper<?>>) list; // <- unsafe widening of NotificationWrapper
castList.add(new NotificationWrapper<>(new StaffNotification()); // <- compiles but throws ClassCastException at runtime
如您所見,以任何方式轉換泛型型別都是不安全或不可取的。要使這個串列更靈活,您需要使用具有所需邊界的通配符(“?擴展 Foo”或“?超級 Foo”或這些的組合)。我推薦nipafx 泛型播放串列以更深入地了解泛型。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494513.html
