簡體   English   中英

Java繼承; 將子類傳遞給超類的抽象方法

[英]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 )。

泛型的常見位置是容器類 (即ListMapSet ),其中容器並不真正關心它跟蹤的類型,而是專注於實際跟蹤和管理這些實例。

泛型由一個或多個類型占位符組成(通常使用Java, ET ,但名稱並不重要;它們通常遵循常規類型命名約定),用於替代特定類或超類。


在您的代碼中,您希望子類在給定其確切相關類型的情況下實現方法(即CarFixer將采用CarJetpackFixer將采用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM