gpt4 book ai didi

java - 如何对多个耦合对象使用泛型?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:57:40 24 4
gpt4 key购买 nike

因此,我无法全神贯注地为此进行适当的设计。

我的应用程序有两个控制状态的关键对象,它们需要相互交互:ItemList、ItemState。它们都依赖于一个通用的 ITEM_TYPE,因此它们可以在不同的上下文中发挥作用。它们也是抽象的,以允许依赖于 ITEM_TYPE 的行为。

这两部分都需要知道通用类型,而且,由于它们相互通信,因此它们需要知道彼此的通用类型。 (一个 ItemList< String > 实例需要知道它的 ItemState 字段是一个 ItemState< String > ,反之亦然)。

我目前的解决方案有效,但看起来很糟糕。一定有更好的方法。这就是我现在正在做的:

public abstract class ItemState<
ITEM_TYPE,
STATE_TYPE extends ItemState<ITEM_TYPE, STATE_TYPE, LIST_TYPE>,
LIST_TYPE extends ItemList<ITEM_TYPE, STATE_TYPE, LIST_TYPE>> {

}
public abstract class ItemList<
ITEM_TYPE,
STATE_TYPE extends ItemState<ITEM_TYPE, STATE_TYPE, LIST_TYPE>,
LIST_TYPE extends ItemList<ITEM_TYPE, STATE_TYPE, LIST_TYPE>> {

}

然后一个实现类可能看起来像:

class StringState extends ItemState<String, StringState, StringList> {

}
class StringList extends ItemList<String, StringState, StringList> {

}

请注意,对于 ItemState,STATE_TYPE 是对实现类的引用,对于 ItemList/LIST_TYPE 也是如此。

如果我只是让 ItemState 成为 ItemList 的内部类,我的问题真的会得到解决,因为会有一个隐式绑定(bind)并且它们可以共享通用声明,但是这两个类都很大而且是独立的,所以我不想这样做.

有什么建议吗?

编辑:作为评论的反例:

public abstract class ItemState<ITEM_TYPE> {  
public abstract ItemList getItemList();
public void doSomething() {
// This should not compile because abstract super class has
// no idea what the generic type of getItemList() is
ITEM_TYPE item = this.getItemList.getItem();
}
}

编辑 2:我认为我能想到的最佳解决方案就是让 ItemList/ItemState 以一种或另一种方式继承,以便它们可以作为同一个类运行。我不喜欢这个解决方案,因为它覆盖了关注点分离,但它使泛型更易于管理。

旁注:我的实际应用程序有 4 个交织类的问题,为了简单起见,我只使用了 2 个。实际上,泛型非常糟糕,难以理解且难以重构(每个类大约有 4 整行泛型声明)。我现在已经把这4个类做成一个垂直的继承层次

JM Yang 的解决方案很不错

最佳答案

我认为您在声明这 2 个类时可能只引用泛型类型 ITEM_TYPE。

我能够正确编译以下代码。

public abstract class ItemList<ITEM_TYPE> {
public abstract ItemState<ITEM_TYPE> getState();

public abstract ITEM_TYPE getItem();
}

public abstract class ItemState<ITEM_TYPE> {
public abstract ItemList<ITEM_TYPE> getItemList();

public void doSomething() {
ITEM_TYPE item = getItemList().getItem();
System.out.println(item);
}
}

public class StringList extends ItemList<String> {
@Override
public StringState getState() {
return new StringState();
}

@Override
public String getItem() {
return "";
}
}

public class StringState extends ItemState<String> {
@Override
public StringList getItemList() {
return new StringList();
}
}

关于java - 如何对多个耦合对象使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32551948/

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