我真的不能想出有关如何在标题中描述我的问题的单词。我想完成的工作就是这样:(伪代码(
SuperClass[] superArray = new SuperClass[];
// work on superArray
// ...
SubClass[] subArray = superArray.asAnArrayOfSubClass();
`这样的事情吗?
您不能将成员:方法或字段添加到数组中。所以不,这是不可能的:
SubClass[] subArray = superArray.asAnArrayOfSubClass();
定义数组的行为,而是创建一个通过数组的方法:
SubClass[] doThat(SuperClass[] superArray){
....
}
即使从概念上讲,类型也不应知道其子类型,如果您的要求是有效的,则可以将特定类型的一个数组转换为该特定类型的子类的数组。
例如,您可以将员工存储在一个阵列中,该阵列被促进了经理。此方法可以进行此转换:
Manager[] promote(Employee[] employees){
Manager[] managers = new Manager[employees.length];
for (int i=0; i<employees.length; i++){
Employee e = employee[i];
managers[i] = new Manager(....);
}
return managers;
}
no。不可能。因为并非每个父母都是孩子。相反,因为每个孩子都是父母。
请参见下面的示例。
Object[] supers = new Object[5];
Integer[] childs = supers // Errrr.. No I have Strings, Doubles too
但可以反向
Integer[] childs = new Integer[5];
Object[] supers = childs // Ok, I can hold any object.
向子类铸造是一种代码气味,也许您应该重新考虑设计。另外,请尝试使用仿制药,而不是原始数组使用Java Collection API(iToser,Collection,List(,您可以在下面添加自己的方法,例如以下示例:
public interface IteratorWithIndex<T> extends Iterator<T> {
int index();
}
有限制您的子类应匹配超级WRT属性和方法,而您仅覆盖这些属性。
以下是如何使用流API进行此操作的示例。
Number[] array = new Number[]{12, 20, 30, 40};
List<Integer> list = Arrays.stream(array)
.map(e -> (Integer) e)
.collect(Collectors.toList());
System.out.println(list.toArray());