java - 重用继承来定义Java中的方法

标签 java generics inheritance

我是一名新的 Java 开发人员,在使用 Java 中的继承概念来定义我的类时遇到了一些困难...

一方面,我有一个名为 Vehicle 的通用类,它定义了数十年的属性(及其 getter/setter)。我有一个 Vehicle1 类,它扩展 Vehicle 类。

另一方面,我有一个名为 VehicleFactory 的通用类,它定义了一个静态方法,如下所示:

public class VehicleFactory {

    protected static Vehicle makeResult() {
        Vehicle result = new Vehicle();

        result.setCode("1");
        result.setNumber("2");
        // other setters methods
        return result;
    }

问题是我想创建一个带有自己的 makeResult 方法的 Vehicle1Factory 类,该方法使用其父类的 makeResult 方法。但我没能做到这一点(这里的目的是优化,因为 Vehicle1 具有 Vehicle 类的所有通用属性,但还有一些附加属性)。

我尝试写的是这样的:

public class Vehicle1Factory extends VehicleFactory {

    protected static Vehicle1 makeResult() {
        Vehicle1 result = new Vehicle1();

         result = (Vehicle1) VehicleFactory.makeResult();

        // I want to reuse the makeResult of its parent class to define
        // its own makeResult method
    }
}

但是当我这样做时,Java 告诉我存在 ClassCastException 并且我不能在此处使用强制转换...

这种情况有什么解决办法吗?

最佳答案

一旦创建了Something的实例,它就永远不能成为其他东西的实例。由于 VehicleFactory.makeResult 创建 Vehicle 实例,因此无法将其转换为 Vehicle1。 您必须为此创建一个新的 Vehicle1

解决方案可以是将要重用的代码移至实用程序方法,例如:

class Vehicle { }

class Bike extends Vehicle { }

class VehicleFactory {
    static Vehicle create() {
        Vehicle vehicle = new Vehicle();
        initialize(vehicle);
        return vehicle;
    }

    private static void initialize(Vehicle vehicle) {
        result.setCode("1");
        result.setNumber("2");
        // ...
    }
}

class BikeFactory {
    static Bike create() {
        Bike bike = new Bike();
        VehicleFactory.initialize(bike);
        return bike;
    }
}

关于java - 重用继承来定义Java中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44359097/

相关文章:

java - 为什么这个数字显示程序不起作用?

swift - 带有关联值的枚举 + 泛型 + 带有关联类型的协议(protocol)

inheritance - 通过注解实现多态 JPA 的最佳实践

c++ - 如何从派生类复制构造函数调用基类复制构造函数?

c++ - 装饰器模式在 C++ 内部是如何工作的?

java - 为什么 CAS(比较和交换)不等同于繁忙的等待循环?

java - 如何在SQL中检索一组表数据?

java - install4j 自动更新启动器集成命令行参数

c# - 使用泛型在 C# 中获取数组元素的总和

java - 参数化类型(如 Class<)的等效 C# 是什么?在 Java 中扩展 Throwable>?