相关疑难解决方法(0)

在Java中展示协方差和逆变?

请给出Java中协方差和逆变的一个很好的例子.

java covariance contravariance

100
推荐指数
2
解决办法
4万
查看次数

如何在Java泛型中使用逆变?

在Java中,协方差允许API设计者指定实例可以被概括为某种类型或任何该类型的子类型.例如:

List<? extends Shape> shapes = new ArrayList<Circle>(); 
// where type Circle extends Shape
Run Code Online (Sandbox Code Playgroud)

反方差则是另一种方式.它允许我们指定实例可以概括为某种类型或超类型.

List<? super Shape> shapes = new ArrayList<Geometry>();
// where Shape extends Geometry
Run Code Online (Sandbox Code Playgroud)

Java泛型的逆变是如何有用的?你什么时候选择使用它?

java generics contravariance

25
推荐指数
3
解决办法
6137
查看次数

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

这是我的第一个问题,我希望它对读者和我自己都足够有用!在过去的两天里,我用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
查看次数