编辑:来自所有其他答案的最终答案:
我在犹豫是否接受titofb回答,因为他是任命好的方法的人。但是我认为这足以解决我应该接受的问题(第一次),以使其他阅读它的人受益。谢谢大家!
抽象Node类实现了这一点:
@SuppressWarnings("unchecked") protected final Class<E> getChildType(){ return (Class<E>)(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]); }因此,任何子节点始终具有可用的方法,该方法从定义SubnodeN定义中返回其自己的类型E扩展Node
public void addSubElement (Node<?> node){ Class<E> expectedChildType = getChildType(); if (expectedChildType.isAssignableFrom(node.getClass())){//if node instanceOf E subElements.add(expectedChildType.cast(node)); } else throw new ClassCastException("A non-expected child was intended to add to this "+this.getClass().getSimpleName()+" element"); }然后这就是魔术。这是默认行为。它会警告您是否期望某个子节点,但是您可以为任何子节点覆盖此方法以处理特殊情况:
@Override public void addSubElement (Node<?> node){ if (node instanceOf SubNode34) {} else super.addSubElement(node) //Parents default behavior }


