带有参数化类型的未经检查的转换警告
Unchecked cast warnings with parameterized types
我正在阅读 Java 教程中关于泛型的限制,特别是 casting with parameterized types。我理解所提供的示例。但是,我不确定以下示例:
List<? extends Number> l1 = new ArrayList<Integer>();
// unchecked cast warning
ArrayList<Number> l2 = (ArrayList<Number>) l1;
// no unchecked cast warning
ArrayList<? extends Number> l3 = (ArrayList<? extends Number>) l1;
第一种情况为什么会有警告,我明白了。为什么第二种情况没有警告?是因为我可以在 l3
上执行的唯一操作是安全的(例如,我不能添加(比如说)一个 Float
到列表中)?
更新: 以下是 section 5.5.2 of the JLS 中解决类似问题的摘录。
A cast from a type S
to a parameterized type (§4.5) T
is unchecked
unless at least one of the following is true:
S <: T
- All of the type arguments (§4.5.1) of
T
are unbounded wildcards
T <: S
and S
has no subtype X
other than T
where the type arguments of X
are not contained in the type arguments of T
.
没有警告,因为转换不会更改类型的通用部分。 List<? extends Number>
和 ArrayList<? extends Number>
具有相同类型的参数。相反,演员表是从 List
到 ArrayList
.
的检查演员表
我正在阅读 Java 教程中关于泛型的限制,特别是 casting with parameterized types。我理解所提供的示例。但是,我不确定以下示例:
List<? extends Number> l1 = new ArrayList<Integer>();
// unchecked cast warning
ArrayList<Number> l2 = (ArrayList<Number>) l1;
// no unchecked cast warning
ArrayList<? extends Number> l3 = (ArrayList<? extends Number>) l1;
第一种情况为什么会有警告,我明白了。为什么第二种情况没有警告?是因为我可以在 l3
上执行的唯一操作是安全的(例如,我不能添加(比如说)一个 Float
到列表中)?
更新: 以下是 section 5.5.2 of the JLS 中解决类似问题的摘录。
A cast from a type
S
to a parameterized type (§4.5)T
is unchecked unless at least one of the following is true:
S <: T
- All of the type arguments (§4.5.1) of
T
are unbounded wildcardsT <: S
andS
has no subtypeX
other thanT
where the type arguments ofX
are not contained in the type arguments ofT
.
没有警告,因为转换不会更改类型的通用部分。 List<? extends Number>
和 ArrayList<? extends Number>
具有相同类型的参数。相反,演员表是从 List
到 ArrayList
.