簡體   English   中英

將通用超類強制轉換為子類

[英]Casting a generic superclass to a subclass

這是我的第一個問題,我希望它對讀者和我自己都足夠有用! 在過去的兩天里,我用Google搜索並躲過了這個世界。

我有抽象的模型和存儲類,從中派生出具體的模型和存儲類:

abstract class Food {}

abstract class FoodStorage<T extends Food> {
    abstract void setFood(T food);
}

class Apple extends Food {}

class Basket extends FoodStorage<Apple> {
    @Override
    void setFood(Apple apple) {
        // Save that apple to the basket
    }
}

沒問題。 現在,我希望能夠直接在Apple實例上調用save() ,將其持久化到其Basket (無需擔心籃子),並在抽象類中實現。 我發現的最好的是:

abstract class Food<T extends Food<T,S>,
        S extends FoodStorage<T,S>> {

    abstract S getStorage();

    void save() {
        getStorage().setFood((T)this); // <---- Unchecked cast warning
    }

}

abstract class FoodStorage<T extends Food<T,S>, S extends FoodStorage<T,S>> {
    abstract void setFood(T food);
}

class Apple extends Food<Apple,Basket> {
    Basket basket = new Basket(); // or Basket.getInstance();

    @Override
    Basket getStorage() {
        return basket;
    }
}

class Basket extends FoodStorage<Apple,Basket> {
    @Override
    void setFood(Apple apple) {
        // Save that apple to the basket
    }
}

哪個有效,但是IntelliJ在save()給出了關於未經檢查的強制轉換的警告。 實際上,我正在從Food<T,S>T

問題:如何以類型安全的方式實現這個apple.save()

我不希望任何通配符出現在客戶端代碼中,所以改變abstract void setFood(T food); abstract <Z extends Food<T,S>> void setFood(Z food); 不是解決方案。 (顯然我也在避免SupressWarnings("unchecked") )。

我知道Java Generics,在使用類層次結構時如何避免未經檢查的賦值警告? Generics演員問題 ,以及the get-put原則 ,但我仍然無法理解它。

提前致謝!

我認為食物和它的存儲之間存在相互依賴性,這似乎是一個值得懷疑的設計。 單向依賴會極大地簡化泛型:

class Food { ... }
class FoodStorage<F extends Food> {
    void setFood(F f);
}

但是如果你堅持相互依賴,你可以在沒有演員表的情況下做到如下:

abstract class Food<F extends Food<F, S>, S extends FoodStorage<F, S>> {
    abstract F getThis();
    abstract S getStorage();

    void save() {
        getStorage().setFood(getThis());
    }
}
abstract class FoodStorage<F extends Food<F, S>, S extends FoodStorage<F, S>> {
    abstract void setFood(F food);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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