Java泛型调用报x/y cannot be resolved or is not a field错误如何解决
报错原因
你定义的Foo类使用了无界泛型参数T,Java编译阶段会把无界泛型的类型擦除为Object类,Object类没有x、y成员变量,因此访问loc.x、loc.y时会触发编译错误。
修复方案
下面提供3种常用修复方式,可根据业务需求选择:
- 方案1:给泛型
T添加上界约束
如果你的Foo类设计上就是用来处理Location及其子类数据,直接给泛型添加上界即可,这是最安全的方案:
public class Foo<K, T extends Location> { public void add(K name, T loc) { System.out.println(name + " " + loc.x + loc.y); } }
- 方案2:方法内做强制类型转换
如果Foo类需要兼容多种不同类型的参数,不想限制泛型上界,可以在访问字段前做强制类型转换,注意该方案需要保证调用add方法时传入的loc参数确实是Location实例,否则会触发运行时类型转换异常:
public class Foo<K, T> { public void add(K name, T loc) { Location location = (Location) loc; System.out.println(name + " " + location.x + location.y); } }
- 方案3:直接移除不需要的泛型参数
如果你的Foo类只会处理Location类型的参数,不需要泛型适配其他类型,直接删除泛型T、把参数类型写死即可,代码更简洁:
public class Foo<K> { public void add(K name, Location loc) { System.out.println(name + " " + loc.x + loc.y); } }
内容的提问来源于stack exchange,提问作者migo101
相关产品推荐
相关产品推荐

