【问题标题】:Assign parent class to child class variable in Java在Java中将父类分配给子类变量
【发布时间】:2013-06-24 19:39:22
【问题描述】:

我有一个父类和一些子类(我们称它们为 parentchild1child2child3 等)。

我有一个函数,它采用二维数组 parents 并将其展平为一维数组,如下所示:

public parent[] flatten(parent[][] input);

在调用上下文中,我知道当我传递一个数组时,所有元素都具有相同的类型,并且该类型是子类型之一(特别是,我知道它是哪个子类型)。我希望能够获取数组的特定元素,并将其分配给正确子类型的变量,如下所示:

child1 c = flatten(input)[0];

我知道类型断言(相关的 SO 帖子:Assert an object is a specific type),但如果断言成功,我似乎无法找到一种方法来实际分配给正确类型的变量。在Java中甚至可能发生这样的事情吗?我知道这在其他语言中是可能的,例如在 Go 中。

【问题讨论】:

    标签: java subclass superclass type-assertion


    【解决方案1】:

    你不能allocate generic arrays,但如果你愿意传递一个外参数,你可以使用泛型来为你处理转换:

     public <T extends Parent> boolean addAll(T[][] input, 
                                              T[] output) {
       //set up you indices
       output[x] = input[z];
       return true;
    }
    

    如果你传入不匹配的输入/输出,你会得到一个运行时错误,否则它应该可以正常工作。

    【讨论】:

      【解决方案2】:

      您真的想将它分配给某个子类型吗?您可以使用Parent 类引用来访问Child 类方法,如果该方法也在Parent 类中定义。

      否则,您可以将类型转换为适当的类型:

      child1 c = (child1)flatten(input)[0];
      

      但是,您应该确保类型仅为child1。通常类型转换不是一个好主意。这是错误代码的标志(但并非总是如此)。你应该尽量避免它。

      【讨论】:

      • 你知道如果我输入错误会发生什么吗?在这种情况下不会发生;我只是好奇。
      • 它会在运行时抛出ClassCastException。如果你确定它不会在这里发生,那没关系。但是,避免这种类型的转换只是一个一般性的想法。
      • 嗯,不错不错。我的参考是 Go,其中类型转换必须在编译时被证明是正确的,类型断言(一种单独的语言结构)用于在运行时才能证明的转换。
      【解决方案3】:

      尝试“投射”,如下所示:

      Child1 c = (Parent)flatten(input)[0];
      

      【讨论】:

        【解决方案4】:

        我认为还值得一提的是,如果您不想为异常处理而烦恼,您可以检查对象的实例。

        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof

        TL;DR:检查你要转换的类的实例。

        if (flatten(input)[0] instanceof child1)
               Child1 c = (Parent)flatten(input)[0];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-30
          • 2013-07-08
          • 1970-01-01
          • 2021-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多