从List <Optional>转换为List <Optional <?>>是否安全?

Bee*_*ope 10 java generics

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

在另一方面,Java并不让您从投List 本身参数与原始类型,比如List<Optional>同类型的参数列表中采用无界通配符,像List<Optional<?>>.

您仍然可以通过完全丢弃原始数据List并再次备份(通过赋值隐式)来执行此操作:

List<Optional> rawOptionalList = null;
List<Optional<?>> wildcardOptionalList = (List)rawOptionalList;
Run Code Online (Sandbox Code Playgroud)

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

在我看来,虽然这种转换可以保证安全:List<Optional<?>>不仅仅像List<Optional>将原始产品Optional转换Optional<?>为安全一样安全吗?


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

Luk*_*ley 2

是的,很安全。通用检查仅在编译时进行。

  • 按照这个标准,将 `List&lt;String&gt;` 转换为 `List&lt;Integer&gt;` 是安全的。 (2认同)