我对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)


使其编译。

10-04 18:16