具有两个泛型的 Java 抽象类

Java Abstract Classes with two Generics

提问人:Michi Sch 提问时间:11/9/2023 最后编辑:Mark RotteveelMichi Sch 更新时间:11/9/2023 访问量:80

问:

我有一个关于具有通用数据类型的 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。我已经在网上搜索过,如何实现具有两种泛型数据类型的抽象类,但是对于我的情况没有令人满意的解决方案。

Java 泛型抽象

评论

0赞 Mark Rotteveel 11/9/2023
请提供确切的编译器错误,而不是错误摘要。在任何情况下,您的代码都没有提供类,这解释了一个问题,第二个问题没有正确生成(您指定了两个不存在的类和 ,而不是两个类型参数)。你需要用 ,这占了两个问题,然后因为无法编译,你有第四个问题。BladeConveyorPRpublic class Conveyor<P, R> extends Machine<P, R>Propeller
3赞 Joachim Sauer 11/9/2023
另外:你认为是什么意思?这应该是一个通用的输送机吗?那么你需要.class Conveyor extends Machine<P, R>class Conveyor<P, R> extends Machine<P, R>
0赞 Silviu Burcea 11/9/2023
我认为您应该澄清输送机和螺旋桨需要做什么。您还需要完成有关泛型的速成课程,以了解参数化类型使用的内容/方式。

答:

2赞 Eran 11/9/2023 #1

如果你也想成为一个泛型类,它应该用泛型类型参数声明:Conveyor

public class Conveyor<P, R> extends Machine<P, R>

如果要扩展 ,其中 和 是实际的类名(即它们不是泛型类型参数),则必须定义这些类。PropellerMachine<Blade, Propeller>BladePropeller

评论

0赞 Silviu Burcea 11/9/2023
另一种选择是使 Conveyor 类扩展 Machine,而不使用泛型类型。
2赞 Eran 11/9/2023
@SilviuBurcea这意味着用作原始类型,这不是一个好主意。它将强制您将实现的返回类型更改为 。MachinefindRessources()Object
1赞 Holger 11/9/2023
@MichiSch 宣言对我来说毫无意义。第二个类型参数由超类用于定义它们的列表。但是为什么螺旋桨应该有一个螺旋桨列表呢?由于这个出发点没有意义,其他评论,从字面上理解这个想法,根本没有帮助。你应该首先考虑你想实现什么。在超类中和是什么意思?class Propeller extends Machine<Blade, Propeller>PR
1赞 Holger 11/9/2023
@MichiSch 类型参数不是“只是一个占位符”,因为如果不使用它们,声明它们就没有意义。如前所述,超类清楚地维护了第二个类型参数。如果这是组件列表,则机器由其组成,则合理的子类将是 和 ,将组件声明为它们的第二个类型参数。第一个类型参数的用途尚不清楚。当然,您必须先创建一个名为的类,然后才能使用它。List<R>RTurbine extends Machine<…, Chamber>Propeller extends Machine<…, Blade>findRessources()Blade
1赞 Holger 11/9/2023
@MichiSch当此方法的返回类型为 时,如何返回?那为什么还要有两个类型参数呢?您最初的问题给人的印象是,抽象基类是由考试给出的,而您的任务是创建子类。falseP