我有以下界面:
切片器
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
我想念什么?
答案 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参数允许它进行编译。