当前位置: 首页 > 知识库问答 >
问题:

在没有强制转换的情况下,泛型父对象不能作为子对象返回

徐隐水
2023-03-14
abstract class GenericBuilder<B extends GenericBuilder>
{
     //lots of build methods
     public B lastBuildingMethodInTheChain(Object someValue)
     {
          //assignment
          return this;//<-- is not allowed!
     }
}

但是当我输入一个cast时:返回(B)this;它很好。演员阵容是我想要防止的,但这也限制了儿童建设者使用他们的特殊方法。最后一件事是有意义的,因为泛型类型只在运行时知道,但我不知道如何编写它,以便它在编译时工作。

谢谢你!

共有1个答案

夏意蕴
2023-03-14

声明GenericBuilder的正确方法是使用F绑定类型:

abstract class GenericBuilder<B extends GenericBuilder<B>> {

    public B lastBuildingMethodInTheChain(Object someValue) {
        // assignment
        return (B) this;
    }
}

您无法避免强制转换,因为编译器需要它知道这个泛型生成器实际上是泛型类型参数的具体生成器。

您可以按以下方式扩展通用生成器:

public class ConcreteBuilder1 extends GenericBuilder<ConcreteBuilder1> {

}
public class ConcreteBuilder2 extends GenericBuilder<ConcreteBuilder3> {

}
 类似资料:
  • 有没有一种简单的方法可以做到这一点: 编辑:我写了一份正确答案的工作副本:

  • 此代码有效。它以“未检查或不安全操作”警告进行编译和运行。 当这两个给我运行时错误时 我遇到的错误如下:

  • 问题内容: 对于一个抽象类,我想定义一个为子类返回“ this”的方法: 我希望能够执行以下操作: 可以说香蕉面包会抛出一个IllegalArgumentException消息“不是蛋糕!”。 问题答案: 编辑 要求子类以某种方式表现是没有问题的,这超出了静态类型可以检查的范围。我们一直在这样做-一页又一页的普通英语指定您如何编写子类。 提出的另一种具有协变返回类型的解决方案必须做同样的事情-用简

  • 假设我有这个方法: 我想调用这个方法,获取字符串,将该字符串转换为整数7,然后以非阻塞方式返回该整数。我该怎么做? 我试过这个,但是函数阻塞(同步): 我尝试使用代替(异步): 但是我得到了这个错误:<代码>类型不匹配:无法从int转换为Mono 那我该怎么办?

  • 对API控制器的远程调用(通过RestTemboard)(从一侧返回已知对象的List([]),从远程侧返回未知类型的对象)返回

  • 问题内容: 我有一堂课 具有通用属性 有更好的方法来执行以下操作吗? 即以不同的形式返回泛型? 精度,我使用Gson作为反序列化器,以获取列表,然后每个Data对象都可以是异构的 。还可以注册适配器以进行浮点和长检测,但不会更快或更漂亮 编辑 :gson无法检索多头: 要么: java.lang.Double无法转换为java.lang.Long 要么 java.lang.NumberFormat