【问题标题】:Returning an object of the same type as the function's caller返回与函数调用者相同类型的对象
【发布时间】:2019-06-05 12:56:08
【问题描述】:

我有两个类,一个扩展另一个类。父类中的大多数函数要么返回自身(在修改调用函数的对象之后),要么返回相同类型的新对象。子类应该共享这些函数,但是它应该返回子类型的对象。

这个问题的明显解决方案是重写每个函数并将它们转换为子类型的对象,但我不想每次创建子类时都这样做。

我做了一些搜索,发现了一些使用通用函数的解决方案。然而,那些要么需要一个额外的Class<T> 参数,要么可能导致类型转换错误。

有没有一种方法可以在父类中创建一个函数,这样父类型或子类型的对象都可以返回自身或相同类型的对象?

【问题讨论】:

标签: java generics return-type


【解决方案1】:

这个问题的明显解决方案是重写每个函数并将它们转换为子类型的对象,但我不想每次创建子类时都这样做。

如果您有创建子类型的新实例的特殊方法,则可以在所有其他方法中重复使用它。您仍然需要在每个子类中覆盖这个方法,但它比覆盖每个方法要好:

public abstract class Parent<T extends Parent<T>> {
  protected abstract T newInstance();

  public T doSomething() {
    T instance = newInstance();
    // do something with instance
    return instance;
  }

  public T doSomethingElse() {
    // do something with this
    return this;
  }
}

public class Child extends Parent<Child> {
  protected Child newInstance() {
    return new Child();
  }
}

Child.doSomething 现在返回 Child 而无需覆盖 doSomething

【讨论】:

  • 我注意到每次调用doSomething() 时,Child 类中的newInstance() 都会返回一个新对象。如果我将return new Child(); 行替换为return this;Parent 中的功能是否仍然有效?
  • @ColePetersen:是的,如果您只是想修改当前实例,您甚至可以在不调用newInstance 的情况下return this;。请参阅doSomethingElse 的更新示例。
  • doSomethingElse 函数中,编译器要我将this 转换为T 或将返回类型更改为Parent&lt;T&gt;。 @casablanca 我应该做什么?
  • @ColePetersen:在这种模式下,铸造通常是安全的,但可能会提出会破坏的奇怪用例(例如,如果你这样做 ChildB extends Parent&lt;ChildA&gt;)。您可以随时添加另一个抽象方法,在每个子类中简单地执行return this;,这将在编译时捕获奇怪的用例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2014-08-31
  • 2011-02-20
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多