我有一个类:
class MyClass {
public MyClass getParent() { ... }
public MyClass[] getChildren() { ... }
....
}
和一个子类
MySubClass extends MyClass {
public String getId() { }
...
}
每次我在 MySubClass
的实例上使用 getChildren()
或 getParent()
时,我必须转换这些方法的结果,例如:
MySubClass sub = new MySubClass();
((MySubClass)sub.getParent()).getId();
有什么方法(通过语言或设计)可以避免这种转换吗?
感谢任何想法!
更新
我想要的是 getParent()
和 getChildren()
总是返回调用它们的实例的类型,例如sub.getChildren()
应该返回 MySubClass[]
最佳答案
您可以使用 self 类型模式:
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
引用,等等。如果您在 MySubClass
上调用 getParent
或 getChildren
,您可以将返回值用作 MySubClass
实例而不用转换到任何地方。
这种方法的主要缺点是以前没有见过它的人往往会很困惑。
关于java - 避免在继承的 java 类中进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092545/