泛型中不可转换的类型

时间:2012-11-09 15:49:14

标签: java generics

  

可能重复:
  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);

2 个答案:

答案 0 :(得分:6)

考虑一下 - 如果getParameters()的返回值实际上是Map<String, ParameterValueImpl>,那么您就可以向地图添加一个来自ParameterValue的值,但不能ParameterValueImpl。你这样做会打破类型安全。

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

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

答案 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>();

然后您的原始方法将起作用。

相关问题