为什么静态方法无法将泛型类型声明为返回值类型?
问题原因
类定义的泛型参数<M>是实例级泛型,只有类实例化的时候才会确定具体类型,而静态方法是类级别的,在类加载阶段就会被初始化,此时还没有实例的泛型类型信息,所以静态方法里不管是参数、返回值还是方法内部直接引用类上定义的<M>都会编译报错,不是只有传参不行,返回值使用该泛型也会触发错误。你去掉类型参数后相当于用了InterestPoint原始类型,所以会收到对应的使用警告。
解决方法
给静态方法单独声明自己的泛型参数,同时给入参也加上对应的泛型约束即可,修改后的代码如下:
public record InterestPoint<M>(Coordinate coordinate, M marker) { public final InterestPoint<M> validate() { return this; } // 静态方法单独声明泛型参数<M>,入参和返回值都绑定该泛型 public static final <M> InterestPoint<M> validate(InterestPoint<M> interestPoint) { interestPoint.validate(); return interestPoint; } }
修改说明:
- 在静态方法的返回值前加
<M>,给该静态方法单独声明独立的泛型参数,这个泛型和类上定义的<M>仅名字相同,作用域仅局限在当前静态方法内部 - 入参的
InterestPoint补充泛型约束为InterestPoint<M>,避免原始类型使用警告 - 调整后静态方法的入参、返回值泛型可以完全匹配,不会再出现编译错误和使用警告
内容的提问来源于stack exchange,提问作者Will Franzen
相关产品推荐
相关产品推荐

