可能重复:
Is `List<Dog>` a subclass of `List<Animal>`? Why aren’t Java’s generics implicitly polymorphic?
我需要帮助了解最新情况。
我有一个界面
public interface Foo {
Map<String, ParameterValue> getParameters();
}
public interface ParameterValue { }
和Foo的实现。
class FooImpl implements Foo {
Map<String, ParameterValueImpl> parameters = new HashMap<String, ParameterValueImpl>();
//ParameterValueImpl an implementation of ParameterValue
@Override
public Map<String, ParameterValue> getParameters() {
return ((Map<String,ParameterValue>) parameters);
}
}
我收到以下错误
[ERROR] Failed to execute goal
failure [ERROR]
src/main/java/domainJPA/model/FooImpl.java:[92,45]
inconvertible types [ERROR] found :
java.util.Map<java.lang.String,domainJPA.model.ParameterValueImpl>
[ERROR] required:
java.util.Map<java.lang.String,domain.model.ParameterValue>
我必须在Foo的接口中使用ParameterValue,而在FooImpl中,我必须只执行ParameterValue(ParameterValueImpl),因为它的@Entity和jpa需要它。
如何编译此代码?
修改
如果我按照其中一个答案中的建议将代码更改为? extends ParameterValue
,那么我就无法使用Foo界面。
以下代码导致编译错误:The method put(String, capture#8-of ? extends ParameterValue) in the type Map<String,capture#8-of ? extends ParameterValue> is not applicable for the arguments (String, ParameterValueImpl)
foo.getParameters().put("test", new ParameterValueImpl);
答案 0 :(得分:6)
考虑一下 - 如果getParameters()
的返回值实际上是Map<String, ParameterValueImpl>
,那么您就可以向地图添加一个来自ParameterValue
的值,但不能ParameterValueImpl
。你这样做会打破类型安全。
您有两种方法可以解决此问题:
getParameters()
中,将地图复制到正确类型的新地图中。Map<String, ParameterValue>
作为FooImpl.parameters
。答案 1 :(得分:5)
您可以将界面方法更改为: -
Map<String, ? extends ParameterValue> getParameters();
现在,您可以返回String
的地图以及实施ParameterValue
的任何类型
然后你不需要在实现这种方法时进行类型转换。
public Map<String, ? extends ParameterValue> getParameters() {
return parameters;
}
或者,由于您可以在ParameterValueImpl
引用中存储ParameterType
类型实例,因此,您还可以将Map
类中的FooImpl
更改为: - < / p>
Map<String, ParameterValue> parameters = new HashMap<String, ParameterValue>();
然后您的原始方法将起作用。