一尘不染

我可以在Java中使用方法链接创建抽象的构建器类,而不进行不安全的操作吗?

java

我正在尝试为某些构建器类提供一个抽象基类,以便可以轻松地在构建器实现之间重用代码。我希望我的构建器支持方法链接,因此方法必须返回最特定类型的“此”实例。我想我可以使用泛型来做到这一点。不幸的是,我没有使用不安全的操作就无法做到这一点。可能吗?

下面是我如何尝试(及其工作方式)的示例代码。我想避免在“ foo()”中强制转换为T(这会导致未经检查的警告),可以这样做吗?

public class Builders
{
   public static void main( final String[] args )
   {
      new TheBuilder().foo().bar().build();
   }
}


abstract class AbstractBuilder<T extends AbstractBuilder<?>>
{
   public T foo()
   {
      // set some property
      return (T) this;
   }
}


class TheBuilder extends AbstractBuilder<TheBuilder>
{
   public TheBuilder bar()
   {
      // set some other property
      return this;
   }

   public Object build()
   {
      return new Object();
   }
}

阅读 184

收藏
2020-12-03

共1个答案

一尘不染

您要声明Textends AbstractBuilder<T>AbstractBuilder

使用abstract protected方法获取thistype T

abstract class AbstractBuilder<T extends AbstractBuilder<T>> {
    protected abstract T getThis();

    public T foo() {
        // set some property
        return getThis();
    }
}


class TheBuilder extends AbstractBuilder<TheBuilder> {
    @Override protected TheBuilder getThis() {
        return this;
    }
    ...
}

或者,TheBuilder如果使实现更加冗长,则删除泛型类型参数,依靠协变量返回类型,并使代码更干净(尽管通常它们将使用客户端,而不是使用基类的大部分实现细节)。

2020-12-03