Java语言规范JLS 4.8规则适用场景解析及示例请求
JLS 4.8规则适用场景解析
向未从超类或超接口继承的原始类型的非静态成员类或接口传递类型实参,属于编译时错误。
核心适用场景
当外部类以原始类型(即不指定泛型参数的实例)存在时,它的非静态内部泛型类(该内部类的泛型是自身定义,而非继承自超类/超接口),如果试图给这个内部类传递类型实参,就会触发该编译错误。
符合规则的错误示例
class Outer<T> { // 内部泛型类,泛型U为自身定义,未继承自超类/超接口 class Inner<U> { U value; } } public class Main { public static void main(String[] args) { // 创建原始类型的外部类实例 Outer rawOuter = new Outer(); // 编译错误:向原始类型Outer的非静态成员类Inner传递类型实参String Outer.Inner<String> inner = rawOuter.new Inner<String>(); } }
示例说明
rawOuter是原始类型Outer的实例,未指定任何泛型参数Inner<U>是Outer的非静态成员类,它的泛型能力来自自身定义,并非继承自超类/超接口- 此处试图给
Inner传递类型实参String,完全匹配JLS 4.8描述的编译错误场景
对比你的代码
你编写的示例中,变量声明类型为OuterGenericClass<String>.InnerGenericClass<Integer>,这里的InnerGenericClass<Integer>属于参数化外部类OuterGenericClass<String>的成员类,而非原始类型OuterGenericClass的成员类。你用原始类型实例outer创建该参数化内部类实例,本质是类型不匹配问题,和JLS 4.8的规则场景无关。
内容的提问来源于stack exchange,提问作者user24723440
相关产品推荐
相关产品推荐

