Java中如何解析外部类被隐藏的类型参数?
问题解答
如何在内部类中访问被隐藏的外部类泛型参数
可以通过外部类名限定泛型参数的方式,在内部类中引用被遮蔽的外部类泛型类型参数。修改后的代码示例如下:
class Scratch<T> { class InnerClass<T> { public void executeHiddenMethod(){ // 使用内部类的T类型 T innerT = null; // 使用外部类的T类型:通过外部类名限定 Scratch.T outerT = null; // 也可以通过外部类实例的类型来使用 Scratch<T> outerInstance = Scratch.this; Scratch.T anotherOuterT = null; } } public static void main(String[] args) { Scratch<String> scr = new Scratch<>(); Scratch<String>.InnerClass<Double> d = scr.new InnerClass<>(); d.executeHiddenMethod(); } }
核心是用Scratch.T明确指代外部类的泛型参数T,避免和内部类的同名泛型参数混淆。
JLS中的相关条款
Java语言规范(JLS)6.4.1节名称遮蔽与隐藏中明确规定:当一个声明的名称在某个作用域内遮蔽了另一个同名声明时,被遮蔽的名称在该作用域内无法直接通过简单名称访问,必须通过限定名称(如外部类名+.+名称)来引用。
对于泛型参数而言,内部类的泛型参数声明会遮蔽外部类的同名泛型参数,因此必须通过外部类名限定的方式来访问被遮蔽的外部类泛型参数,这是符合JLS规则的,并非禁止暴露,而是需要遵循名称限定的语法。
内容的提问来源于stack exchange,提问作者theutonium.18
相关产品推荐
相关产品推荐

