提问人:Michi Sch 提问时间:11/9/2023 最后编辑:Mark RotteveelMichi Sch 更新时间:11/9/2023 访问量:80
具有两个泛型的 Java 抽象类
Java Abstract Classes with two Generics
问:
我有一个关于具有通用数据类型的 Java 抽象类的问题。在上一个考试中,我们需要实现一个抽象类,其中包含两种泛型数据类型,如下所示:
public abstract class Machine<P, R> {
public List<R> list = new ArrayList<>();
public abstract P findRessources();
}
在第一个子类中,我们必须实现这样的 conveyor 类:
public class Conveyor extends Machine<P, R>{
@Override
public P findRessources() {
return null;
}
在第二个子类中,我们必须实现一个螺旋桨类,它将两个叶片变成一个螺旋桨:
public class Propeller extends Machine<Blade, Propeller>{
@Override
public Blade findRessources() {
return null;
}
}
我在子类中收到一个错误,无法解析 P、R、Blade 和 Propeller。我已经在网上搜索过,如何实现具有两种泛型数据类型的抽象类,但是对于我的情况没有令人满意的解决方案。
答:
2赞
Eran
11/9/2023
#1
如果你也想成为一个泛型类,它应该用泛型类型参数声明:Conveyor
public class Conveyor<P, R> extends Machine<P, R>
如果要扩展 ,其中 和 是实际的类名(即它们不是泛型类型参数),则必须定义这些类。Propeller
Machine<Blade, Propeller>
Blade
Propeller
评论
0赞
Silviu Burcea
11/9/2023
另一种选择是使 Conveyor 类扩展 Machine,而不使用泛型类型。
2赞
Eran
11/9/2023
@SilviuBurcea这意味着用作原始类型,这不是一个好主意。它将强制您将实现的返回类型更改为 。Machine
findRessources()
Object
1赞
Holger
11/9/2023
@MichiSch 宣言对我来说毫无意义。第二个类型参数由超类用于定义它们的列表。但是为什么螺旋桨应该有一个螺旋桨列表呢?由于这个出发点没有意义,其他评论,从字面上理解这个想法,根本没有帮助。你应该首先考虑你想实现什么。在超类中和是什么意思?class Propeller extends Machine<Blade, Propeller>
P
R
1赞
Holger
11/9/2023
@MichiSch 类型参数不是“只是一个占位符”,因为如果不使用它们,声明它们就没有意义。如前所述,超类清楚地维护了第二个类型参数。如果这是组件列表,则机器由其组成,则合理的子类将是 和 ,将组件声明为它们的第二个类型参数。第一个类型参数的用途尚不清楚。当然,您必须先创建一个名为的类,然后才能使用它。List<R>
R
Turbine extends Machine<…, Chamber>
Propeller extends Machine<…, Blade>
findRessources()
Blade
1赞
Holger
11/9/2023
@MichiSch当此方法的返回类型为 时,如何返回?那为什么还要有两个类型参数呢?您最初的问题给人的印象是,抽象基类是由考试给出的,而您的任务是创建子类。false
P
评论
Blade
Conveyor
P
R
public class Conveyor<P, R> extends Machine<P, R>
Propeller
class Conveyor extends Machine<P, R>
class Conveyor<P, R> extends Machine<P, R>