【问题标题】:Write a generic method to copy an array编写一个泛型方法来复制一个数组
【发布时间】:2015-11-15 03:36:28
【问题描述】:

对于我的编程任务,我被要求编写一个通用的复制方法来从一个数组复制到一个相同大小和类型的数组。这在Java中甚至可能吗?我尝试的一切都以一些“通用数组创建”错误告终。我迷路了,不知道如何解决这个问题!

public class copyArray<AnyType>{

   public copyArray(AnyType[] original){ 

     AnyType[] newarray = new AnyType[original.length];  

     for(int i =0; i<original.length; i++){ 
        newarray[i] = original[i]; } 
}

【问题讨论】:

  • 你发布这些尝试怎么样?所以我们可以“提示”你在正确的轨道上
  • 点击上面的edit 链接将您的代码添加到问题中,而不是将其转储到 cmets 中。
  • @3kings 我添加了上面尝试过的代码
  • 好吧,对于初学者来说,你不能以这种方式实例化一个泛型数组。
  • @MikeSchmidt 您应该在下面看到答案。这会帮助你。

标签: java arrays copy


【解决方案1】:

您可以使用反射的概念编写一个可以在运行时确定类型的通用复制方法。简而言之,反射是在运行时检查类、接口、字段和方法的能力,而无需在编译时知道类、方法等的名称。

java.lang.Reflectjava.lang.Class 组成 Java 反射 API。这个方法使用这两个类和它们的一些方法来创建一个通用的arrayCopy 方法,它将为我们找出类型。

更多信息:What is reflection and why is it useful?

可能不熟悉的语法

  • Class&lt;?&gt; 使用通配符运算符 ?,它基本上表示我们可以拥有一个未知类型的 Class 对象 - 类 Class 的通用版本。
  • &lt;T&gt; 是一个通用运算符,代表 raw type
  • ArrayArray 类提供静态方法来动态创建和访问 Java 数组。即,此类包含允许您设置和查询数组元素的值、确定数组的长度以及创建新的数组实例的方法。我们将使用Array.newInstance()
  • 来自反射 API 的方法

  • getClass () - 返回一个数组,其中包含代表所有公共类和接口的 Class 对象,这些公共类和接口是所表示的类对象的成员。
  • getComponentType() - 返回表示数组的组件类型(什么类型,即 int 等)的类。
  • newInstance() - 获取一个新的数组实例。
  • private <T> T[] arrayCopy(T[] original) {
    
        //get the class type of the original array we passed in and determine the type, store in arrayType
        Class<?> arrayType = original.getClass().getComponentType();
    
        //declare array, cast to (T[]) that was determined using reflection, use java.lang.reflect to create a new instance of an Array(of arrayType variable, and the same length as the original
        T[] copy = (T[])java.lang.reflect.Array.newInstance(arrayType, original.length);
    
        //Use System and arraycopy to copy the array
        System.arraycopy(original, 0, copy, 0, original.length);
        return copy;
    }
    

    【讨论】:

      【解决方案2】:

      更简单的解决方案是使用任何数组的现有 clone() 方法(除非您的分配明确告诉不要使用 clone()):

      public static <T> T[] arrayCopy(T[] original) {
          return original.clone();
      }
      

      其实你根本不需要这种通用的辅助方法,你可以直接调用clone()方法(它也适用于原始数组)。

      【讨论】:

        猜你喜欢
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 2017-02-19
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        相关资源
        最近更新 更多