使用上边界通配符时不兼容的类型 [英] Incompatible types when using upper bounding wildcard

查看:169
本文介绍了使用上边界通配符时不兼容的类型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的很困惑上边界类型在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆