[英]“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.