我目前正在设计模拟项目的类层次结构。这将是一个Element
实例树的离散事件模拟。为了简洁起见(因为我只对这个问题的泛型部分感兴趣),所以我只会在这里展示类/接口的草图,所以语法不会很完美。有东西下手,一个元素可能是这样的:用泛型限制容器
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
的定义并不重要,什么其他的方法都应该做的是不言自明的希望。为了使事情变得有趣婉转我们抛出另一个接口入池:
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, ?>>
我开始觉得有点模糊关于这一点,有更多的游戏:
- 有有是“端口”(
Input
和Output
),将元素从一个容器转移到另一个容器。我也必须在这些方面抛出一些泛型魔法。 - 我的待办事项列表中有模型的GUI编辑器。所以我必须在运行时也提供这些检查。所以我猜想会出现类型文字和编辑器必须依赖的
public boolean canAdd(Element<?, ?> e)
之类的东西。因为这个方法非常重要,所以我希望它有Element
类的final
方法,所以没有醉酒的开发人员可能在凌晨4点出错。 - 这将是很酷,如果
Element
的子类可以自己决定他们正在使用的类,因为从一些LinkedList
或任何似乎是完美的适合。
因此,这里是我的问题:
- 我是重新发明轮子呢?哪个库为我做?
- 可以,我应该用泛型来解决这个问题吗? (如果答案是肯定的:对实现的一些提示非常欢迎)
- 这可能有点过度设计?
- 这个问题有更好的标题吗? :-)
- (刚落,在这里您的意见)
这里有一个想法给你。 java中泛型的目的是防止ClassCastException。句号。这是他们以理智的方式做的唯一事情。如果你试图用它来做其他事情,那就是疯狂。 – Affe 2011-01-19 21:07:26
“这种方式对疯狂是谎言”,哈哈......在我了解类型删除之前,我尝试了各种各样的泛型技巧,但很快就了解到,大多数情况下,泛型的创造性使用注定要失败。如果它看起来真的很疯狂像元素,C扩展元素>你应该怀疑使用它们。概念化这些用途太难了。 –
2011-01-19 21:25:30