java 不可转换的类型_关于Java:泛型中的不可转换类型

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

Is `List` a subclass of `List`? Why aren’t Java’s generics implicitly polymorphic?

我需要帮助理解发生了什么。

我有一个接口

public interface Foo {

Map getParameters();

}

public interface ParameterValue { }

以及foo的实现。

class FooImpl implements Foo {

Map parameters = new HashMap();

//ParameterValueImpl an implementation of ParameterValue

@Override

public Map getParameters() {

return ((Map) parameters);

}

}

我得到以下错误

[ERROR] Failed to execute goal

failure [ERROR]

src/main/java/domainJPA/model/FooImpl.java:[92,45]

inconvertible types [ERROR] found   :

java.util.Map

[ERROR] required:

java.util.Map

我必须在foo的接口中使用parameterValue,在fooimpl中,我必须只实现parameterValue(parameterValueImpl),因为它是@entity,JPA需要它。

我怎样才能编译这段代码?

编辑

如果我按照其中一个答案中的建议将代码更改为? extends ParameterValue,那么我就不能使用foo接口。

以下代码导致编译错误:The method put(String, capture#8-of ? extends ParameterValue) in the type Mapis not applicable for the arguments (String, ParameterValueImpl)。

foo.getParameters().put("test", new ParameterValueImpl);

stackoverflow.com/questions/2745265/…

想想看——如果getParameters()的返回值实际上是一个Map,那么您就可以向源自ParameterValue而不是ParameterValueImpl的映射中添加一个值。这样做会破坏类型安全。

您有两个选项可以更正此问题:

在getParameters()中,将地图复制到正确类型的新地图中。

使用Map作为FooImpl.parameters的类型。

我不能做第二部分,因为fooimpl是一个JPA实体,如果我使用这个接口,它将无法识别它。我不太明白这一点。

最后,您可能不得不使Foo成为一个通用接口,类型参数用作映射的第二个类型参数。

我理解复制部分,我改为理解。似乎暂时有效。

但是要小心,因为您要返回一个副本,所以向这个方法返回的映射中添加项目对FooImpl实例中包含的映射没有影响。考虑返回只读副本,以便任何修改映射的尝试都将导致错误。

您可以将接口方法更改为:

Map getParameters();

现在,您可以返回String和任何实现ParameterValue的类型的映射。

那么在实现这个方法时就不需要进行类型转换了。

public Map getParameters() {

return parameters;

}

或者,由于您可以在ParameterType引用中存储ParameterValueImpl类型实例,因此您也可以将FooImpl类中的Map更改为:

Map parameters = new HashMap();

那你原来的方法就行了。

如果我使用? extends ParameterValue,那么下面的代码就不需要cx1〔3〕,它会给我错误消息The method put(String, capture#8-of ? extends ParameterValue) in the type Mapis not applicable for the arguments (String, ParameterValueImpl)。

如果地图是? extends Type的类型,就不能修改它。因为您不知道可以实际插入哪种类型。如果你想修改你的地图。那你应该走第二条路。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值