用方法创建对象数组



我真的不能想出有关如何在标题中描述我的问题的单词。我想完成的工作就是这样:(伪代码(

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());

最新更新