我对Java泛型中上限类型的工作方式感到困惑。
假设我有
interface IModel<T>
interface I
class A implements I
class B implements I
class C implements I
然后我有一个参数的方法如下
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泛型的文档,试图用Google搜索它,但是肯定有些东西我完全被误解了。
最佳答案
这个问题可以简称为为什么foo(IModel<List<? extends I>> dataModel)
不能接受像IModel<List<A>> model
说明List<A>
是List<? extends I>
的子类型,所以可以:
public void bar(List<? extends I> list);
List<A> listA;
bar(listA);
但是,它不会像
IModel<List<A>>
is not a subtype of IModel<List<? extends I>>
一样使IModel<Dog>
成为IModel<Animal>
的子类型,因此无法编译您发布的代码。解
您可以将其更改为:
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)
使其编译。