You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 08:22:23