gpt4 book ai didi

java - 使用上限通配符时不兼容的类型

转载 作者:行者123 更新时间:2023-11-30 06:04:18 24 4
gpt4 key购买 nike

我真的很困惑 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>> IModel<List<? extends I>> 的子类型,就像 IModel<Dog> is not a subtype of 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)

使其编译。

关于java - 使用上限通配符时不兼容的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49792654/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com