[英]Java Inheritance: method in subclass overrides method in superclass
[英]Java inheritance; passing a subclass to an abstract method of a superclass
對不起標題,無法想出更清楚的東西。 我有以下結構:
public interface Vehicle {...}
public class Car implements Vehicle {...}
然后:
public abstract class Fixer {
...
abstract void fix(Vehicle vehicle);
...
}
並希望:
public class CarFixer extends Fixer {
void fix(Car car) {...}
}
但這不起作用。 Eclipse說: The type CarFixer must implement the inherited abstract method 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) {...}
}
您的原始版本的問題是fix
方法允許任何類型的車輛,但您的實施類只允許汽車。 考慮以下代碼:
Fixer fixer = new CarFixer();
fixer.fix(new Bike()); // <-- boom, `ClassCastException`, Bike is a vehicle but not a car
你已經遇到了仿制葯的卑微家園。
泛型提供了一種“通配符”類型,其中類或方法可以指定“我們並不真正關心它是什么類型,我們只需要-a type” 。
泛型允許超類在子類中強制執行特定類型,而不允許任何擴展某個類的類。
這意味着你最終強制執行一個新的允許的最高超類作為參數(即, Vehicle
不再是你可以傳遞給fix()
最基本的允許類型;它現在是子類所說的,只要它任意類型擴展Vehicle
)。
泛型的常見位置是容器類 (即List
, Map
和Set
),其中容器並不真正關心它跟蹤的類型,而是專注於實際跟蹤和管理這些實例。
泛型由一個或多個類型占位符組成(通常使用Java, E
和T
,但名稱並不重要;它們通常遵循常規類型命名約定),用於替代特定類或超類。
在您的代碼中,您希望子類在給定其確切相關類型的情況下實現方法(即CarFixer
將采用Car
, JetpackFixer
將采用Jetpack
)但您希望強制執行這些類型擴展Vehicle
。
為了強制執行此操作,您必須准確告訴Fixer
類您的子類想要什么。
public abstract class Fixer <E extends Vehicle>
{
abstract void fix(E vehicle);
}
然后你的子類擴展了Fixer,用它想要的類型填充E
public class CarFixer extends Fixer<Car>
{
@Override
void fix(Car vehicle)
{
// ...
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.