我可以在java中使用方法链,而不做不安全的操作吗?

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

以下示例代码(以及它如何工作)。我想避免在“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();
   }
}
你想声明T为extends AbstractBuilder< T>在AbstractBuilder中。

使用抽象保护的方法得到这个类型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而不是基类的大部分实现细节),如果使实现更详细。

http://stackoverflow.com/questions/5818504/can-i-have-an-abstract-builder-class-in-java-with-method-chaining-without-doing

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:我可以在java中使用方法链,而不做不安全的操作吗?