当前位置: 首页 > 面试题库 >

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

田仲卿
2023-03-14
问题内容

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

下面是我如何尝试(及其工作方式)的示例代码。我想避免在“ 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();
   }
}

问题答案:

您要声明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如果使实现更加冗长,则删除泛型类型参数,依靠协变量返回类型,并使代码更干净(尽管通常它们将使用客户端,而不是使用基类的大部分实现细节)。



 类似资料:
  • 我是第一次在学校项目中使用JavaFX,所以很可能我做了一些明显错误的事情。 在我的controller类中,我有一个方法(customerSU),它创建了一个新的Customer和Cleast对象,我使用这些新的Customer和Cleast对象的其他方法有一个错误“无法解析符号”Cust1“。 谢谢你的帮助!

  • 问题内容: 有没有一种方法可以在Markdown中创建在新窗口中打开的链接?如果没有,建议您使用哪种语法。我将其添加到我使用的markdown编译器中。我认为这应该是一个选择。 问题答案: 就Markdown语法而言,如果要详细说明,则只需使用HTML。 我见过的大多数Markdown引擎都允许使用纯旧的HTML,仅在这种情况下,即通用文本标记系统无法将其截断。(例如,StackOverflow引

  • 问题内容: 如何在Python中使类或方法抽象? 我尝试像这样重新定义: 但是现在,如果我创建一个像这样继承的类: 那么我也无法实例化,因为它调用了其超类的方法。 有没有更好的方法来定义抽象类? 问题答案: 使用该模块创建抽象类。使用装饰器来声明方法摘要,并根据您的Python版本使用以下三种方式之一声明类摘要。 在Python 3.4及更高版本中,您可以从继承。在Python的早期版本中,您需要

  • 问题内容: 如何在C ++中创建一个抽象类,该抽象类具有一些我想在子类中重写的抽象方法?该文件应如何显示?是否有一个,如果是的话,应该看起来如何? 在Java中,它看起来像这样: 对于我来说,将此代码转换为C ++就足够了。 编辑: 我创建了代码,但是当我尝试遍历对象时,出现以下错误: 使用此代码: 问题答案: 在Java中,除非您声明了所有方法,否则默认情况下所有方法都是默认方法。在C ++中,

  • 我通过学校为一项任务提供的简报创建了一个飞机座位预订系统。我遇到了一个我无法解决的主要问题。 摘要说明抽象类必须有一个抽象方法和大约4个公共方法。在抽象类的两个子类中,我们都必须初始化对象数组(所有普通的座位)。然而,一旦它们被初始化,我不知道如何将它们发送回抽象类(该类有一个检查未预订的飞机座位的方法,这就是我需要初始化的座位对象的地方) ArrayIndexOutOfBounds在一个应该在边