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

从通配符转换为特定的泛型参数化类型是Java中捕获转换的一个示例吗?,java,generics,casting,jls,unbounded-wildcard,Java,Generics,Casting,Jls,Unbounded Wildcard,对于以下编译无误且运行无异常的代码: 公共类主 { 公共静态void main(字符串[]args){ List unbounded=new ArrayList(); List strList=(List)unbounded;//这是捕获转换吗? List intList=(List)unbounded;//这是捕获转换吗? } } 上面的代码片段是在Java中工作的捕获转换示例吗 据JLS称 存在从参数化类型G(§4.5)到参数化类型G的捕获转换,其中,对于1≤ 我≤ n: 如果Ti是形式

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

公共类主
{
公共静态void main(字符串[]args){
List unbounded=new ArrayList();
List strList=(List)unbounded;//这是捕获转换吗?
List intList=(List)unbounded;//这是捕获转换吗?
}
}
上面的代码片段是在Java中工作的捕获转换示例吗

据JLS称

存在从参数化类型G(§4.5)到参数化类型G的捕获转换,其中,对于1≤ 我≤ n:

  • 如果Ti是形式为?的通配符类型参数(§4.5.1),则Si是一个新类型变量,其上限为Ui[A1:=S1,…,An:=Sn],下限为null类型(§4.1)
我对上述语句的理解如下:如果通配符的形式为“?”,则存在从G到G的捕获转换,只要“S”在对象(上限)和(下限)的范围内

因此,例如,在上面的代码片段中,将“List”转换为“List”将是捕获转换,不会引发任何运行时异常(这也在JLS中说明)?对吗?另外,如果说它不会因为类型擦除而引发运行时异常,是否正确?


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

您的代码不包含捕获转换,而是包含未经检查的强制转换。检查实际示例,特别是
反向
方法示例。简而言之,捕获转换意味着您可以将未知类型的列表
List
视为特定(但仍然未知)类型的列表
List
。JLS评论中很好地解释了为什么它有用(以及为什么它安全)。@JoachimSauer我明白了。我还可以看到编译器对未检查的转换发出警告。在这种情况下,我发现我并不真正理解捕获转换是什么。正如我在JLS中所读到的(如我的问题描述中所引用的),JLS似乎将捕获转换描述为将通配符形式转换为参数化类型。你能指出我对问题描述中引用的JLS部分的误解吗?我也读过这篇关于捕获转换的文章:。在JLS给出的示例中,我看到在将通配符泛型传递给具有“List”形式参数的方法时会发生捕获转换。这和我给出的代码示例不一样吗?是否将通配符转换为参数化类型?我觉得我的代码和JLS中的示例之间有点不同,但我无法真正解释这种差异以及幕后发生了什么。如果有人能帮助我真正理解捕获转换或者为我指出更多的资源,那将是最好的。捕获转换是“自动”发生的,而不是显式转换。我真的举不出比你链接到的更好的例子了。