这段代码无法编译,我很难理解为什么:
private final Map<String, ValueWriter<? extends Value>> valueWriters = new HashMap<>();
public void write(CompositeValue value) throws IOException {
for (Entry<String, ValueWriter<? extends Value>> writer : valueWriters.entrySet()) {
Value v = value.getValue().get(writer.getKey());
ValueWriter<? extends Value> valueWriter = writer.getValue();
valueWriter.write(v);
}
}
这在valueWriter.write(v)
上给出了以下编译错误:
incompatible types: Value cannot be converted to capture#1 of ? extends Value
其中ValueWriter的实现方式如下:
public interface ValueWriter<T extends Value> {
void write(T value) throws IOException;
void delete(Key key) throws IOException;
}
基本上,我希望valueWriter
接受任何实现Value接口的类。为什么这不起作用,我如何实现它?
最小可重现性示例:
public class Main {
private ValueWriter<? extends Value> writer;
public void write(Value v) {
writer.write(v);
}
interface Value {
}
interface ValueWriter<T extends Value> {
void write(T v);
}
}
1条答案
按热度按时间mcvgt66p1#
当你写:
valueWriter
可以是ValueWriter<A>
类型,其中A
扩展Value
。然后
valueWriter.write
期望A
类型的东西...而你给予v
类型Value
。编译器不能保证v
是A
类型(取决于实际的valueWriter
类型)。你应该使用如下代码重写程序:
其中
A
扩展了Value
,并将A
设置为v
的类型。A
应该由程序在某处引入。