java - 避免在继承的 java 类中进行强制转换

标签 java inheritance casting

我有一个类:

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() { ... }
}

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

这种方法的主要缺点是以前没有见过它的人往往会很困惑。

关于java - 避免在继承的 java 类中进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19092545/

相关文章:

java - 自动售货机改变Java

java - Java 中 wait() 和 notifyAll() 的行为?

inheritance - 运行时的 Fortran TYPE 继承(由用户声明)

scala - 反向继承

c# - 强制子类初始化一个变量

c++ - void*字面意思是float,怎么投?

java - Appium findElement 连续使用两次不工作

即使查询在 mysql admin 中有效,JAVA MYSQL 准备好的语句也会给出空结果集

java - 使用 Asterisk 接听电话(AMI/AGI 或其他)

java - Java For Each 语句中的 Cast 元素