2

对于以下编译无误、无异常运行的代码:

public class Main
{
    public static void main(String[] args) {
        List<?> unbounded = new ArrayList<String>();

        List<String> strList = (List<String>) unbounded;    // Is this a capture conversion?
        List<Integer> intList = (List<Integer>) unbounded;  // Is this a capture conversion?
    }
}

上面的代码片段是在 Java 中工作的捕获转换的示例吗?

据 JLS 报道,

存在从参数化类型 G<T1,...,Tn> (§4.5) 到参数化类型 G<S1,...,Sn> 的捕获转换,其中,对于 1 ≤ i ≤ n :

  • 如果 Ti 是 ? 形式的通配符类型参数(第 4.5.1 节),则 Si 是一个新类型变量,其上限为 Ui[A1:=S1,...,An:=Sn],下限为空类型(§4.1)。

我对上述语句的理解如下:如果通配符的形式为“?”,则只要“S”在Object的范围内(上限) ,就存在从 G<T> 到 G<S> 的捕获转换和(下限)。

那么,例如在上面的代码片段中,将 'List<?>' 转换为 'List<Integer>' 将是一个捕获转换,它不会抛出任何运行时异常(这在 JLS 中也有说明)?那是对的吗?另外,说它不会由于类型擦除而引发运行时异常是否正确?

如果是这样,捕获转换不会破坏类型安全吗?根据 JLS,引入捕获转换是为了在不破坏类型系统的情况下使通配符更有用?

4

0 回答 0