pointer(); } 我有一个实现: DynamoDbSlicer public abstr-6ren">
gpt4 book ai didi

java - "Attempting to use incompatible return type"具有实现可序列化的类

转载 作者:行者123 更新时间:2023-11-30 01:50:08 29 4
gpt4 key购买 nike

我有以下界面:

切片器

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

我有一个实现:

DynamoDbSlicer

public abstract class DynamoDbSlicer implements Slicer {

@Override
public abstract Optional<Map<String, AttributeValue> pointer();
}

其中 AttributeValue 来自 AWS SDK,定义为:

public final class AttributeValue implements SdkPojo, Serializable, ToCopyableBuilder<AttributeValue.Builder, AttributeValue> {

请注意,它实现了可序列化

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

pointer() in DynamoDbSlicer clashes with pointer() in Slicer; attempting to use incompatible return type

我错过了什么?

最佳答案

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

看起来像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> 的子类型-- 可以将前一种类型的实例分配给后一种类型的变量。

但是,添加 Optional使其无法编译,原因与 a List<Dog> isn't a List<Animal> 相同——泛型是不变的。在这个类比中,Dog就像匹配 Map<String, Serializable> 的特定子类型,和Animal就像匹配 Map<String, ? extends Serializable> 的一般类型。就像 List<Dog>不是List<Animal> ,一个Optional<Map<String, Serializable>>不是Optional<Map<String, ? extends Serializable>> .

在不删除 Optional 的情况下进行编译的最简单方法bit 是与类型完全匹配。

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

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

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

类型参数允许编译。

关于java - "Attempting to use incompatible return type"具有实现可序列化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56365964/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com