我有一个类:

class MyClass {

  public MyClass getParent() { ... }

  public MyClass[] getChildren() { ... }

  ....

}

和一个子类
MySubClass extends MyClass {

  public String getId() { }

  ...
}

每次我在getChildren()实例上使用getParent()MySubClass时,我都必须转换theese方法的结果,例如:
MySubClass sub = new MySubClass();
((MySubClass)sub.getParent()).getId();

是否有任何方法(通过语言或设计)来避免这种转换?

感谢您的任何想法!

更新
我想要的是getParent()getChildren()始终返回从中调用它们的实例的类型,例如sub.getChildren()应该返回MySubClass[]

最佳答案

您可以使用自我类型模式:

class MyClass<T extends MyClass<T>> {
  public T getParent() { ... }
  public List<T> getChildren() { ... }  // you can use an array here too, but don't :)
}

class MySubclass extends MyClass<MySubclass> {
  public String getId() { ... }
}

您可以根据需要实现getParentgetChildren方法,在MyClass中声明包含T引用的字段,并知道它们至少起MyClass引用的作用,等等。而且,如果您在getParent上调用getChildrenMySubClass,则可以将返回值用作MySubClass实例,并且不进行任何强制转换。

这种方法的主要缺点是,以前从未看过的人会变得很困惑。

10-08 18:48