从List <optional>转换为List <optional <?>&gt;?是否安全?

时间:2017-12-05 18:59:27

标签: java generics

如果您在Java中使用原始类型,则可以使用无界通配符安全地将其指定/转换为相同类型。例如,List可以安全地转换为List<?>,这会消除其原始性质,并允许您以安全(类型检查)方式使用它 1 。< / p>

另一方面,Java不允许您从使用原始类型参数化的List (例如List<Optional>)转换为相同的列表带有无界通配符的类型参数,如List<Optional<?>>

您仍然可以通过完全放弃原始List并再次备份(隐式通过分配)来执行此操作:

List<Optional> rawOptionalList = null;
List<Optional<?>> wildcardOptionalList = (List)rawOptionalList;

当然,这会触发有关未经检查的转化的警告(从ListList<Optional<?>>)。

在我看来,这种转换可以保证安全:不像List<Optional<?>>那样安全List<Optional>,就像将Optional生成{Optional<?>一样{1}}安全吗?

1 ...但您永远无法在此列表中添加任何内容,因为对于?方法的add(?)捕获,任何内容都不匹配。这是你为安全付出的代价。

2 个答案:

答案 0 :(得分:2)

是的,这很安全。通用检查就在编译时。

答案 1 :(得分:1)

Java中的

Type erasure意味着所有参数化类型都在运行时被擦除。在您的情况下,List<Optional>在运行时只是List,而Optional<MyClass>在运行时只是Optional

当您从ListOptional获取包含的类时,Java会对参数化类型进行强制转换。因此,不仅代码安全,而且正是Java编译器所做的。