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)
{
// ...
}
}