gpt4 book ai didi

java - 将泛型类型添加到 EnumMap

转载 作者:行者123 更新时间:2023-12-01 11:39:45 25 4
gpt4 key购买 nike

我正在尝试将实例添加到以下 EnumMap:

class ActiveG<D extends GData, T extends GTemplate> {

EnumMap<GStateType, GState<ActiveG<D,T>> map;
..
..
}

class TGData extends GData {...}
class TGTemplate extends GTemplate {....}

class ActiveTG extends ActiveG<TGData, TGTemplate> {

// fails with compilation error
super.states.put(GStateType.WAITING, new TGWaitingState<ActiveTG>(this));
...
...
}

我得到的错误:

The method put(GStateType, GState<ActiveG<TGData,TGTemplate>>) in the
type EnumMap<GStateType,GState<ActiveG<TGData,TGTemplate>>> is not
applicable for the arguments (GStateType, TGWaitingState<ActiveTG>)

任何人都可以尝试帮助我找出缺少的内容以使其正常工作吗?谢谢!

最佳答案

简而言之,Java 中的泛型不是协变。

例如如果你有

class Parent {...}

class Child extends Parent {...}

Foo<Child>不是Foo<Parent>

返回您的代码:

你的枚举映射在 ActiveTG期待GState<ActiveG<TGData,TGTemplate>>作为值,但你给它一个 TGWaitingState<ActiveTG> ,这是 GState<ActiveTG> .

虽然ActiveTG是-a ActiveG<TGData,TGTemplate> , GState<ActiveTG>不是GState<ActiveG<TGData,TGTemplate>> .

为了解决这个问题,您需要对类型参数进行相当多的更改,例如

class ActiveG<D extends GData, 
T extends GTemplate,
E extends ActiveG<D,T>> {
EnumMap<GStateType, GState<E>> map;
}

或者简单地创建 map类型 EnumMap<GStateType, GState<? extends ActiveG<D,T>> 。在某些情况下,这可能不太有效,例如,您需要将结果检索为 GState<ActiveTG>而不是GState<ActiveG<D,T>>

关于java - 将泛型类型添加到 EnumMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29635708/

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