1

我有一个父类和一些子类(我们称它们为parentand child1, child2,child3等)。

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

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

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

child1 c = flatten(input)[0];

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

4

4 回答 4

1

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

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

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

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

于 2013-06-24T19:42:41.337 回答
1

尝试“铸造”,如下所示:

Child1 c = (Parent)flatten(input)[0];
于 2013-06-24T19:46:21.090 回答
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];
于 2013-06-24T20:09:13.617 回答
1

你不能分配泛型数组,但如果你愿意传入一个外参数,你可以使用泛型来为你处理转换:

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

如果您传入不匹配的输入/输出,您将收到运行时错误,否则它应该可以正常工作。

于 2013-06-24T20:22:27.290 回答