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
相关产品推荐
相关产品推荐

