gpt4 book ai didi

java - 使用泛型限制容器

转载 作者:行者123 更新时间:2023-11-30 05:07:03 26 4
gpt4 key购买 nike

我目前正在为一个模拟项目设计类层次结构。这将是 Element 树的离散事件模拟实例。为了简洁起见(并且因为我只对问题的泛型部分感兴趣),我将仅在此处呈现类/接口(interface)的草图,因此语法并不完美。首先,元素可能如下所示:

public abstract class Element {
private Set<Element> children = new HashSet<Element>();
public Element getContainer();
public Collection<Element> getChildren() {
return Collections.unmodifiableSet(children);
}
public Position getPosition();
protected void add(Element e) { children.add(e); }
protected void remove(Element e) {children.remove(e); }
}

Position的定义并不重要,我希望其他方法应该做什么是不言自明的。为了让事情变得稍微有趣,我们将另一个接口(interface)放入池中:

public abstract class Solid extends Element {
public Size getSize();
}

再说一遍 Size 的确切含义没关系,一个Solid应该只是一个填充模拟世界空间的物理对象。现在我们有了实体对象,我们可能想将它们堆叠在一起,所以这里是 Stack :

public abstract class Stack extends Solid {
public void add(Solid s); // <- trouble ahead!
}

这就是麻烦开始的地方。我真的只想要 Solid 的实例添加到 Stack 。那是因为堆叠没有大小的对象很困难,所以Stack需要有 Size 的东西。因此我重新设计了我的Element允许表达这一点:

public abstract class Element<E extends Element<?>> {
private final Set<E> children = new HashSet<E>();
public Element<?> getContainer();
public Collection<E> getChildren();
public Position getPosition();
public void add(E e);
public void remove(E e);
}

我在这里的目的是表达 Element可以限制 Element 的(子)类型它可能包含。到目前为止,这一切都有效。但现在我觉得有必要对 Element容器进行限制。那看起来像什么?

public interface Element<E extends Element<?,?>, C extends Element<?, ?>>

或者更像这样:

public interface Element<E extends Element<?,C>, C extends Element<E, ?>>

我开始对此感到有点模糊,而且游戏还有更多内容:

  • 必须有“端口”( InputOutput )将元素从一个容器传输到另一个容器。我还必须对这些施展一些泛型魔法。
  • 我的待办事项列表中的模型有一个 GUI 编辑器。因此,我也必须在运行时提供这些检查。所以我猜会有类型文字和类似 public boolean canAdd(Element<?, ?> e) 的东西编辑就得靠了。因为这个方法非常重要,所以我想将它设置为 final Element的方法类,所以醉酒的开发人员不可能在凌晨 4 点出错。
  • 如果 Element 的子类会很酷可以自己决定Collection他们正在使用的类,因为来自一些 LinkedList或任何看起来完美合适的东西。

这是我的问题:

  • 我是在重新发明轮子吗?哪个图书馆可以为我做这个?
  • 我可以并且应该使用泛型来解决这个问题吗? (如果答案是肯定的:非常欢迎有关实现的一些提示)
  • 这会不会有点过度设计?
  • 这个问题有更好的标题或标签吗? :-)
  • (请在这里发表您的意见)

最佳答案

我对你想要做什么仍然有点模糊,但如果你想一直运行到它的逻辑结论,我会看到这样的东西:

/**
@param P parent
@param C child
@param S self
*/
interface Element<P extends Element<?, S, P>,
C extends Element<S, ?, C> ,
S extends Element<P, C, S>> {
public P getParent();
public Collection<C> getChildren();
}

这表达了(我认为)你所有的限制:我的 parent 必须是可以让我作为 child 的人,而我的 child 必须是可以让我作为 parent 的人。

实现将包括:

/** An agglomeration of stacks: no parent */
class Agglomeration extends Element<?, Stack, Agglomeration> {…}

/** A stack of solids */
class Stack extends Element<Agglomeration, Solid, Stack> {…}

/** A solid in a stack: no children */
class Solid extends Element<Stack, ?, Solid> {…}

不过,我现在没有打开 Java IDE,所以我无法确认这是否真的可以编译——我有一种感觉,编译器会提示这些问号,并试图把你拖入一些东西喜欢

class Agglomeration extends Element<? 
extends Element<?
extends Element<?
extends...

不过,如果将 ParentChild 分成单独的接口(interface)(一个使用 getChildren() ,另一个使用getParent()),因此 Agglomeration 仅实现第一个,Solid 仅实现第二个,而 Stack 实现两者.

这可能会带来更多的麻烦,而不是它的值(value),但是先运行一段时间,看看它会带你到哪里。 :)

关于java - 使用泛型限制容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4740647/

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