簡體   English   中英

實現序列化的類的“嘗試使用不兼容的返回類型”

[英]“Attempting to use incompatible return type” with class implementing Serializable

我有以下界面:

切片機

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開發工具包,定義為:

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

注意,它實現了Serializable

我在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<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, Serializable>的子類型Map<String, ? extends Serializable> Map<String, ? extends Serializable> -可以將前者的實例分配給后者類型的變量。

但是,添加Optional會使它由於List<Dog>不是List<Animal>原因而無法編譯-泛型是不變的。 在這個類比中, Dog類似於與Map<String, Serializable>匹配的特定子類型,而Animal類似於與Map<String, ? extends Serializable> Map<String, ? extends Serializable> 就像List<Dog>不是List<Animal>Optional<Map<String, Serializable>>不是Optional<Map<String, ? extends Serializable>> Optional<Map<String, ? extends Serializable>>

在不刪除Optional位的情況下進行編譯的最簡單方法是完全匹配類型。

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

如果這不符合您的要求,則需要在您的類可以作為類型實參提供的接口上創建一個類型實參。

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

使用type參數可以對其進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM