Java双泛型抽象类子类实现报错:类型无法解析求助
问题解决:Java双泛型抽象类子类的编译错误
错误原因分析
- Conveyor类报错:
P和R是抽象类Machine的泛型参数,但Conveyor继承时直接使用P、R却未提前声明,编译器无法识别这两个符号。 - Propeller类报错:
Blade未定义/未导入,导致编译器无法解析该类型。
具体修复方案
1. 修复Conveyor类
根据需求选择以下两种方式之一:
方式一:Conveyor作为具体类(指定具体泛型类型)
如果Conveyor有明确的资源类型和产出类型,直接替换P、R为具体类。比如假设Conveyor的资源是ConveyorPart,产出是自身:
// 先确保ConveyorPart类已定义 public class ConveyorPart {} public class Conveyor extends Machine<ConveyorPart, Conveyor> { @Override public ConveyorPart findRessources() { // 实现具体逻辑,返回ConveyorPart实例 return new ConveyorPart(); } }
方式二:Conveyor作为泛型类(保留泛型参数)
如果Conveyor需要继续复用泛型,需先声明自己的泛型参数,再传递给父类:
public class Conveyor<P, R> extends Machine<P, R> { @Override public P findRessources() { // 根据需求实现逻辑,返回P类型实例 return null; } }
2. 修复Propeller类
- 第一步:确保
Blade类已正确定义,比如在同一个包下创建:
public class Blade {}
- 第二步:修正Propeller类(若Blade在其他包,需添加
import语句):
public class Propeller extends Machine<Blade, Propeller> { @Override public Blade findRessources() { // 实现获取叶片的逻辑,返回Blade实例 return new Blade(); } }
额外注意事项
- 父类中的
List<R> list = new ArrayList<>();建议改为私有或受保护,通过getter/setter访问,符合封装原则。 - 泛型参数命名尽量见名知意,比如用
ResourceType代替P,ProductType代替R,提升代码可读性。
内容的提问来源于stack exchange,提问作者Michi Sch
相关产品推荐
相关产品推荐

