小编weh*_*tyk的帖子

将通用超类强制转换为子类

这是我的第一个问题,我希望它对读者和我自己都足够有用!在过去的两天里,我用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
    }
}
Run Code Online (Sandbox Code Playgroud)

没问题.现在,我希望能够save()直接在一个Apple实例上调用它,将其持久化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>> { …
Run Code Online (Sandbox Code Playgroud)

java generics casting type-safety

7
推荐指数
1
解决办法
1854
查看次数

标签 统计

casting ×1

generics ×1

java ×1

type-safety ×1