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

JLS中接口类型转最终类类型的强制转换合法性疑问

编译错误原因分析

你对JLS 8 §5.5.1规则的理解存在偏差,问题出在对“T的超类型X是G的调用”这一条件的解读上:

JLS 8 §5.5.1中针对接口类型S转最终类T的规则明确要求:当S是泛型G的参数化类型/原始类型时,T的某个直接超类型X必须是G的参数化调用本身(也就是X就是G<...>这种形式),而不是继承自G参数化类型的其他接口。

回到你的代码:

  • S_intrf是G<String>的子接口,属于G的参数化类型的派生接口
  • 最终类T_clss实现的是X接口,而X只是继承了G<String>,X本身并不是G的参数化调用(G的调用是G<String>,而非X)

这就导致代码不满足规则要求,触发编译错误。

修正示例

如果让T_clss直接实现G<String>(同时保留实现X接口也可以),就能满足规则:

class Scratch {
  public static void main(String[] args) {
    S_intrf S = new S_clss();
    T_clss T = (T_clss) S; // 编译通过
  }
}

interface G<T> {}

interface S_intrf extends G<String> {}
class S_clss implements S_intrf {}

interface X extends G<String> {}
final class T_clss implements X, G<String> {} // 直接实现G<String>

或者简化结构,让T_clss直接实现G<String>而去掉X接口,同样可以通过编译。

内容的提问来源于stack exchange,提问作者theutonium.18

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:30:49