【问题标题】:Creating Arrays of Objects With Methods使用方法创建对象数组
【发布时间】:2018-07-18 18:20:59
【问题描述】:

我真的想不出如何在标题中描述我的问题。 我想要完成的是这样的:(伪代码)

SuperClass[] superArray = new SuperClass[];
// work on superArray
// ...
SubClass[] subArray = superArray.asAnArrayOfSubClass();

` 这样的事情可能吗?

【问题讨论】:

  • 可以SubClass[] subArray = (SubClass[]) superArray,但是不行;它会给你一个ClassCastException。所以真正的问题是:想要达到什么目标?
  • 例如,您最好使用ArrayList
  • @Seelenvirtuose 我决定要编写自己的线性代数类和方法。我创建了一个超类Vector 和子类RowColumn,我希望通过输入行或列来初始化矩阵。我只是想知道是否可以先创建一个“向量”类的数组,然后将其转换为行或列数组。可能不是这样做的最佳方式,但这无论如何都是出于学习目的

标签: java arrays oop


【解决方案1】:

您不能将成员:方法或字段添加到数组中。所以不,这是不可能的:

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

【讨论】:

    【解决方案2】:

    没有。不可能。因为不是每个父母都是孩子。反过来也是可能的,因为每个孩子都是父母。

    请看下面的例子。

    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.
    

    【讨论】:

    • 好吧,我将如何为子类的 array 创建一个方法?我只是想知道是否可以在不迭代旧数组并一一声明新数组的值的情况下这样做。
    • @galalmighty 我只是想知道是否可以在不迭代旧数组并一一声明新数组的值的情况下这样做。
    • 这是可能的。我也使用过流。请看我的回答。
    【解决方案3】:

    转换为子类是一种代码味道,您可能应该重新考虑您的设计。还可以尝试使用带有泛型而不是原始数组的 java 集合 api(Iterable、Collection、List),您可以将其子类化并添加自己的方法,如下例所示:

    public interface IteratorWithIndex<T> extends Iterator<T> {
        int index();
    }
    

    【讨论】:

      【解决方案4】:

      您的子类应与超类 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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多