返回与函数调用者类型相同的对象

时间:2019-06-04 03:04:28

标签: java generics return-type

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

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

我进行了一些搜索,找到了一些使用泛型函数的解决方案。但是,它们要么需要额外的library(tidyverse) pass_val = 3 df %>% rownames_to_column() %>% gather(col, val, -rowname) %>% separate("col", c("type", "num"), sep = -1) %>% count(rowname, type, pass = val >= pass_val) %>% spread(pass, n, fill = 0) %>% transmute(rowname, type, pass_pct = `TRUE`/(`TRUE` + `FALSE`)) %>% spread(type, pass_pct) %>% filter(post == 1 & pre >= 0.5 | post >= 0.5 & pre == 1) 参数,否则可能会导致类型转换错误。

是否可以在父类中创建函数,以便父或子类型的对象可以返回自身或同类型的对象?

2 个答案:

答案 0 :(得分:0)

  

是否可以在父类中创建函数,从而   父或子类型的对象可以返回自身或对象   相同类型的

是,有铸造。考虑以下示例:

fin

答案 1 :(得分:0)

  

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

如果您有特殊的方法来创建子类型的新实例,则可以在所有其他方法中重用此方法。您仍然必须在每个子类中重写此方法,但是比重写每个方法要好:

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