泛型中不可转换的类型

She*_*ari 3 java generics

可能重复:
`List <Dog>`是`List <Animal>`的子类?为什么Java的泛型不是隐式多态的?

我需要帮助了解最新情况.

我有一个界面

public interface Foo {

  Map<String, ParameterValue> getParameters();
}

public interface ParameterValue { }
Run Code Online (Sandbox Code Playgroud)

并实现了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);
    }   

}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

[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>
Run Code Online (Sandbox Code Playgroud)

我必须在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);

cdh*_*wie 6

想一想 - 如果返回值getParameters()实际上是a Map<String, ParameterValueImpl>,那么你就可以向地图中添加一个值ParameterValue,但不是ParameterValueImpl.这样做会打破类型安全.

您有两种方法可以解决此问题:

  1. getParameters(),将地图复制到正确类型的新地图.
  2. 使用Map<String, ParameterValue>作为类型FooImpl.parameters.


Roh*_*ain 5

您可以将界面方法更改为: -

Map<String, ? extends ParameterValue> getParameters();
Run Code Online (Sandbox Code Playgroud)

现在,您可以返回String实现您的地图和任何类型的地图ParameterValue

那么你不需要在实现这个方法时需要一个类型转换.

public Map<String, ? extends ParameterValue> getParameters() {
    return parameters;
}   
Run Code Online (Sandbox Code Playgroud)

或者,由于您可以ParameterValueImplParameterType引用中存储类型实例,因此,您还可以MapFooImpl类更改为: -

Map<String, ParameterValue> parameters = new HashMap<String, ParameterValue>();
Run Code Online (Sandbox Code Playgroud)

然后你的原始方法将起作用.