为何无法创建包含方法泛型类型字段的本地record?
为何无法创建包含方法泛型类型字段的本地record?
无效示例
public class Test { <T> void foo(T param) { record Container(T content) { } Container test = new Container(param); } }
报错信息
non-static type variable T cannot be referenced from a static context.
(中文翻译:无法从静态上下文中引用非静态类型变量T)
可行但冗余的示例
public class Test { <T> void foo(T param) { record Container<S>(S content) { } Container<T> test = new Container<>(param); } }
原因解析
Java中方法内定义的本地record是隐式静态的,这是语言层面的设计规则。而方法的泛型变量<T>属于方法的非静态上下文(它绑定到方法的具体调用实例),静态的本地record无法访问外围方法的非静态类型变量,所以直接用T作为record字段类型会触发报错。
后面的可行示例之所以能运行,是因为给本地record显式声明了自己的泛型<S>,再用方法的T去实例化这个泛型record,相当于绕开了静态上下文访问外围泛型的限制,不过这种写法确实冗余——明明可以复用方法的T,却不得不额外声明一个泛型参数。
内容的提问来源于stack exchange,提问作者Lukas Betz
相关产品推荐
相关产品推荐

