我有一个类:
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() { ... }
}
您可以根据需要实现
getParent
和getChildren
方法,在MyClass
中声明包含T
引用的字段,并知道它们至少起MyClass
引用的作用,等等。而且,如果您在getParent
上调用getChildren
或MySubClass
,则可以将返回值用作MySubClass
实例,并且不进行任何强制转换。这种方法的主要缺点是,以前从未看过的人会变得很困惑。