Java设置泛型变量值时报Required type: T Provided: T错误如何解决?
报错原因分析
- 泛型参数作用域冲突:你在类级别定义了泛型参数
<T>,成员变量page的类型是和类绑定的类级泛型T。但你在setGenericVar方法上又单独声明了<T>,这个是方法级的独立泛型参数,和类级的T只是名字相同,实际是完全无关的两个类型,所以方法入参的T类型值无法直接赋值给类级T类型的成员变量,编译器就会抛出看起来矛盾的「要求T类型,提供的也是T类型」的报错。 - 额外代码问题:原代码里
this.page = page语句缺少结束分号,且main方法不符合Java入口方法规范,没有加static修饰,非静态方法无法直接作为程序入口执行。
解决方案
方案1:复用类级别泛型(推荐,符合常规泛型使用场景)
直接移除方法上的独立泛型声明,让方法入参复用类级别的T,保证入参类型和成员变量类型一致。修改后的代码如下:
public class GenericVariables<T> { private T page; // 修正为静态main方法作为程序入口 public static void main (String args[]) { // 创建类实例,指定泛型类型为Integer GenericVariables<Integer> intObj = new GenericVariables<>(); intObj.setGenericVar(2); // 如果需要存字符串,创建对应泛型的实例即可 GenericVariables<String> strObj = new GenericVariables<>(); strObj.setGenericVar("one"); } // 移除方法上独立的<T>声明,复用类泛型 public void setGenericVar(T page) { // 补充分号 this.page = page; } }
方案2:方法需要独立泛型的场景处理
如果你确实需要这个set方法可以接收任意类型的参数,不受类泛型限制,需要做两处修改:
- 将方法的泛型参数改名避免和类泛型重名产生歧义
- 成员变量类型改为
Object适配任意类型入参
修改后的代码如下:
public class GenericVariables<T> { // 成员变量改为Object类型适配任意入参 private Object page; public static void main (String args[]) { GenericVariables<Object> obj = new GenericVariables<>(); obj.setGenericVar("one"); obj.setGenericVar(1); } // 方法泛型改名避免和类泛型冲突 public <E> void setGenericVar(E page) { this.page = page; } }
内容的提问来源于stack exchange,提问作者paugarreina
相关产品推荐
相关产品推荐

