Java规范JLS5.1.6.2示例疑问:如何构造带警告的转型场景
构造触发转型警告的代码示例
要触发目标警告,只需给S新增另一个子类型X,让S除T外存在其他子类型。此时编译器无法在编译期确定S<String>实例的具体子类型(可能是T<String>,也可能是X<String>),因此会触发未检查转换警告。
示例代码
class T<A> extends S<A> {} class S<L> {} // 新增S的另一个子类型X class X<B> extends S<B> {} class Main { public static void main(String[] args) { // 此处会触发"未检查的转换"警告 T<String> pc = (T<String>) new S<String>(); } }
原理说明
根据JLS 5.1.6.2条款的条件:
从类型S到参数化类或接口类型T的窄化引用转换是未检查的,除非至少满足以下条件之一:……– T是S的子类型(T <: S),且S除T外没有其他子类型X,其中X的类型实参未包含在T的类型实参中。
新增X后,S除T外存在子类型X。当将S<String>转换为T<String>时,X<String>作为S<String>的子类型,虽类型实参与T<String>一致,但X<String>并非T<String>的子类型。编译器无法验证转换安全性,因此触发未检查转换警告。
内容的提问来源于stack exchange,提问作者user24723440
相关产品推荐
相关产品推荐

