实现类可序列化的类的“尝试使用不兼容的返回类型”

时间:2019-05-29 17:43:30

标签: java generics inheritance types

我有以下界面:

切片器

ExpressionAttributeNames = {
            '#value_map': 'value_map.startTime'
        }

我有一个实现:

DynamoDbSlicer

public interface Slicer {
    Optional<Map<String, ? extends Serializable>> pointer();
}

其中public abstract class DynamoDbSlicer implements Slicer { @Override public abstract Optional<Map<String, AttributeValue> pointer(); } 来自AWS开发工具包,定义为:

AttributeValue

请注意,它实现了public final class AttributeValue implements SdkPojo, Serializable, ToCopyableBuilder<AttributeValue.Builder, AttributeValue> {

我在Serializable中的抽象方法上遇到编译器错误:

DynamoDbSlicer

我想念什么?

1 个答案:

答案 0 :(得分:1)

乍一看,这似乎应该编译,因为Java(从1.5开始)具有返回类型协方差。这意味着重写方法可以声明一个返回类型,该返回类型是原始方法的返回类型的子类型。

看起来sapply(letters[1:10], function(z) as.data.frame(sapply(1:7, function(y) rbinom(300, 1, sample(seq(.4, .9, by=.1), 1, prob = NULL)))), colnames(letters[1:10]) <- (animal)) Optional<Map<String, Serializable>>的子类型,但不是。有趣的是,如果您从两种返回类型中都删除了Optional<Map<String, ? extends Serializable>>部分,则会进行编译。

Optional

之所以进行编译,是因为interface Slicer { Map<String, ? extends Serializable> pointer(); } abstract class DynamoDbSlicer implements Slicer { @Override public abstract Map<String, Serializable> pointer(); } Map<String, Serializable>的子类型-可以将前者的实例分配给后者的变量。

但是,添加Map<String, ? extends Serializable>导致编译失败,原因与a List<Dog> isn't a List<Animal>相同-泛型是不变的。以此类推,Optional类似于与Dog匹配的特定子类型,而Map<String, Serializable>类似于与Animal匹配的常规类型。就像Map<String, ? extends Serializable>不是List<Dog>一样,List<Animal>不是Optional<Map<String, Serializable>>

在不删除Optional<Map<String, ? extends Serializable>>位的情况下进行编译的最简单方法是完全匹配类型。

Optional

如果这不符合您的要求,那么您需要在您的类可以作为类型实参提供的接口上创建一个类型实参。

abstract class DynamoDbSlicer implements Slicer {
    @Override
    public abstract Map<String, ? extends Serializable> pointer();
}

type参数允许它进行编译。