使用上边界通配符时不兼容的类型 [英] Incompatible types when using upper bounding wildcard
问题描述
我真的很困惑上边界类型在Java泛型中是如何工作的。
I'm really confused of how upper bounded types work in Java generics.
假设我有
interface IModel<T>
interface I
class A implements I
class B implements I
class C implements I
然后我有一个带参数的方法如下
then I have a method with parameter as follows
foo(IModel<Map<? extends I, Map<? extends I, List<? extends I>>>> dataModel)
调用该方法,如
IModel<Map<A, Map<B, List<C>>>> model = ...
foo(model)
以编译错误结束
Error:(112, 49) java: incompatible types: IModel<java.util.Map<A,java.util.Map<B,java.util.List<C>>>> cannot be converted to IModel<java.util.Map<? extends I,java.util.Map<? extends I,java.util.List<? extends I>>>>
我从Oracle网站上读过关于Java泛型的文档,试图谷歌它,但必须有我完全被误解的东西。
I have read docs about Java generics from the Oracle web, trying to google it, but there must be something I totally misunderstood.
推荐答案
这个问题可以简短为什么
This question can be shorted as why
foo(IModel< List<?extends I>> dataModel)
不能接受像
IModel< List< A>> model
列表< A>
是的子类型<?扩展我>
,所以没关系:
public void bar(List<? extends I> list);
List<A> listA;
bar(listA);
但是,它不会使 IModel< List< A>>
的子类型IModel< List<?扩展I>>
,就像 IModel< Dog>
不是 IModel< Animal>
的子类型,因此代码您发布的内容无法编译。
But, it does not make IModel<List<A>>
a subtype of IModel<List<? extends I>>
, just like IModel<Dog>
is not a subtype of IModel<Animal>
, so the code you posted can not be compiled.
您可以将其更改为:
foo(IModel<? extends Map<? extends I, ? extends Map<? extends I, ? extends List<? extends I>>>> dataModel)
或
<FIRST extends I, SECOND extends I, THIRD extends I> void foo(IModel<Map<FIRST, Map<SECOND, List<THIRD>>>> dataModel)
使其编译。
这篇关于使用上边界通配符时不兼容的类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!