编写一个通用方法以复制一个数组。

4

在我的编程作业中,我被要求编写一个通用的复制方法,将一个数组复制到一个大小和类型相同的数组中。在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]; } 
}

1
你能把那些尝试的内容发出来吗?这样我们就可以给你指点迷津,让你走上正确的轨道。 - 3kings
1
点击上方的[编辑]链接,将您的代码添加到问题中,而不是将其倾倒到评论中。 - C-Pound Guru
@3kings 我添加了我尝试过的代码。 - Mike Schmidt
首先,你不能以那种方式实例化一个泛型数组。 - Makoto
@MikeSchmidt 你应该在下面看到答案。那会帮助你的。 - 3kings
@MikeSchmidt 已添加解释。希望这有所帮助! - Michael Queue
2个回答

9
您可以使用反射的概念编写通用复制方法,以便在运行时确定类型。简而言之,反射是在运行时检查类、接口、字段和方法的能力,而不需要在编译时知道类、方法等的名称。 java.lang.Reflectjava.lang.Class 组成了Java反射API。该方法使用这两个类及其某些方法来创建一个通用的 arrayCopy 方法,以便为我们找到类型。
更多信息:什么是反射,它有什么用处? 可能不熟悉的语法:

  • Class<?>使用通配符操作符?,基本上意味着我们可以拥有一个未知类型的Class对象 - 一个泛型版本的类Class
  • <T>是一个通用操作符,表示原始类型
  • Array类提供了静态方法来动态创建和访问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()方法(它也适用于基本数组)。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接