从通配符转换为特定的泛型参数化类型是 Java 中捕获转换的示例吗?

问题描述

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

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(第 4.5 节)到参数化类型 G 的捕获转换,其中,对于 1 ≤ i ≤ n :

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

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

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)