在Java中将父类分配给子类变量

时间:2013-06-24 19:39:22

标签: java subclass superclass type-assertion

我有一个父类和一些子类(让我们称之为parentchild1child2child3等。< / p>

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

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

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

child1 c = flatten(input)[0];

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

4 个答案:

答案 0 :(得分:1)

你真的想把它分配给某些Child类型吗?如果方法也在Parent类中定义,则可以使用Child类引用来访问Parent类方法。

否则,您可以输入强制类型:

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

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

答案 1 :(得分:1)

尝试“施放”,如下所示:

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

答案 2 :(得分:1)

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

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];

答案 3 :(得分:1)

你不能allocate generic arrays,但是如果你愿意传递一个外派,你可以使用泛型来为你照看演员:

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

如果传入不匹配的输入/输出,则会出现运行时错误,否则它应该正常工作。