java - 如何为返回实现类型的抽象类编写方法?

标签 java generics

我有一个名为 FooFactory 的 Java 抽象类。 withDate 是其中一种方法,它显然表明我最终想用给定的日期构建 Foo 的实现。

我的问题是这样的。如何从 withDate 返回我的 FooFactory 实现实例?这是我尝试过的:

abstract class FooFactory<T extends FooFactory<T>>
{
    private date;

    public T withDate(Date date)
    {
        this.date = date;
        // Does not work
        return this;
    }

    public abstract Foo build();

    // more with methods and a build method
}

然后我想做的是拥有这样的东西:

public final class BarFooFactory extends FooFactory<BarFooFactory>
{
    @Override
    public BarFoo build()
    {
        BarFoo barFoo = new BarFoo()
        super.populateFooProperties(barFoo);
        return barFoo;
    }
}

对于那些好奇为什么我只是不想返回 FooFactory 的人来说,原因是编译器将在 FooFactory 的上下文中解释 future 的调用和构建调用,因此我无法真正链接调用。

我想做的事有可能吗?

最佳答案

我见过适用于类似问题的解决方案是定义一个返回子类实例的 getThis() 抽象方法。它避免了未经检查的转换警告,但可能会激怒一些纯粹主义者。

abstract class FooFactory<T extends FooFactory<T>> {
  private Date date;

  public abstract T getThis();

  public T withDate(Date date) {
    this.date = date;
    return getThis();
  }

关于java - 如何为返回实现类型的抽象类编写方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28944922/

相关文章:

generics - 泛型类型的泛型构造函数的显式类型注释

ios - 测试定义为 Any 的值的数组包含,但保证属于同一类型。

c# - 将泛型类型声明为接口(interface)的属性?

java - ResultSet 的 getString() 方法是否可以用于从 MySQL 表中获取 TEXT 类型列的值?

java - 使用 AIDL 在两个进程之间传输 Parcelable

java - java中程序关闭后如何存储变量的值

java - Java 8 foreach 函数中多于 1 个命令

scala - 扩展泛型类型 - PriorityQueue

typescript - 获取 TypeScript 中泛型类型的特定键的类型

java - 从 BroadcastReceiver 收集数据到 csv