如果您在Java中使用原始类型,则可以使用无界通配符安全地将其指定/转换为相同类型。例如,List
可以安全地转换为List<?>
,这会消除其原始性质,并允许您以安全(类型检查)方式使用它 1 。< / p>
另一方面,Java不允许您从使用原始类型参数化的List
(例如List<Optional>
)转换为相同的列表带有无界通配符的类型参数,如List<Optional<?>>
。
您仍然可以通过完全放弃原始List
并再次备份(隐式通过分配)来执行此操作:
List<Optional> rawOptionalList = null;
List<Optional<?>> wildcardOptionalList = (List)rawOptionalList;
当然,这会触发有关未经检查的转化的警告(从List
到List<Optional<?>>
)。
在我看来,这种转换可以保证安全:不像List<Optional<?>>
那样安全List<Optional>
,就像将Optional
生成{Optional<?>
一样{1}}安全吗?
1 ...但您永远无法在此列表中添加任何内容,因为对于?
方法的add(?)
捕获,任何内容都不匹配。这是你为安全付出的代价。
答案 0 :(得分:2)
是的,这很安全。通用检查就在编译时。
答案 1 :(得分:1)
Type erasure意味着所有参数化类型都在运行时被擦除。在您的情况下,List<Optional>
在运行时只是List
,而Optional<MyClass>
在运行时只是Optional
。
当您从List
或Optional
获取包含的类时,Java会对参数化类型进行强制转换。因此,不仅代码安全,而且正是Java编译器所做的。