Java继承;将子类传递给超类的抽象方法

Java继承;将子类传递给超类的抽象方法,java,inheritance,interface,abstract,Java,Inheritance,Interface,Abstract,对不起,我想不出更清楚的标题了。 我的结构如下: public interface Vehicle {...} public class Car implements Vehicle {...} 然后: 并希望: public class CarFixer extends Fixer { void fix(Car car) {...} } 但这不起作用。Eclipse说:类型CarFixer必须实现继承的抽象方法Fixer.fix(Vehicle)。你知道如何解决这个问题吗?你可以使

对不起,我想不出更清楚的标题了。 我的结构如下:

public interface Vehicle {...}
public class Car implements Vehicle {...}
然后:

并希望:

public class CarFixer extends Fixer {
    void fix(Car car) {...}
}

但这不起作用。Eclipse说:
类型CarFixer必须实现继承的抽象方法Fixer.fix(Vehicle)
。你知道如何解决这个问题吗?

你可以使用泛型来解决这个问题:

public abstract class Fixer<T extends Vehicle> {
    abstract void fix(T vehicle);
}

public class CarFixer extends Fixer<Car> {
    void fix(Car car) {...}
}

你遇到了我的简陋家

泛型提供了一种“通配符”类型,其中类或方法可以指定“我们并不真正关心它是什么类型,我们只需要-a-type”

泛型允许超类在子类中强制执行特定类型,而不允许任何扩展特定类的类。

这意味着您最终将强制一个新的最高允许超类作为参数(即,
Vehicle
不再是您可以传递给
fix()
的最基本允许类型;现在不管子类说它是什么,只要该任意类型扩展
Vehicle

泛型的常见位置是(即
List
Map
、和
Set
),在这些位置,容器并不真正关心它跟踪的类型,而是关注于实际跟踪和管理这些实例

泛型由一个或多个类型占位符组成(在Java中,
E
T
是常用的,但名称并不重要;它们通常遵循常规的类型命名约定),用于代替特定类或超类


在您的代码中,您希望子类实现给定确切相关类型的方法(即
CarFixer
将采用
Car
s,
JetpackFixer
将采用
Jetpack
s),但您希望强制这些类型扩展
Vehicle

为了实现这一点,您必须准确地告诉
Fixer
类您的子类想要什么

public abstract class Fixer <E extends Vehicle>
{
    abstract void fix(E vehicle);
}

这是因为Eclipse是正确的。重载不是覆盖。请考虑一个通用的<代码>固件>代码>类。
Fixer fixer = new CarFixer();
fixer.fix(new Bike()); // <-- boom, `ClassCastException`, Bike is a vehicle but not a car
public abstract class Fixer <E extends Vehicle>
{
    abstract void fix(E vehicle);
}
public class CarFixer extends Fixer<Car>
{
    @Override
    void fix(Car vehicle)
    {
         // ...
    }
}