【问题标题】:Generic method to fill an array填充数组的通用方法
【发布时间】:2014-02-23 17:44:44
【问题描述】:

我正在为学校学习java,主题是通用方法。我需要编写一个具有通用方法的应用程序来“填充”具有相同元素的任何类型的数组。但它不起作用......任何人都可以帮助我:

package pack.switchshift;
import java.lang.reflect.Array;

public class Filler {

    public static void main(String [] args) {
        int[] intArr = new int[10];
        String[] stringArr = new String[10];
        double[] doubleArr = new double[10];

        genFill(intArr, 0);
        genFill(stringArr, "0");
        genFill(doubleArr, 0.0);

        for (int element : intArr){
            System.out.print(element);
        }
    }

    private static <T> void genFill(T[] arr, T element) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] = element;
        }
    }
}

我尝试了多种方法并花了几个小时研究,但我仍然没有得到它。

线程“main”java.lang.Error 中的异常:未解决的编译问题:
Filler 类型中的方法 genFill(T[], T) 不适用于参数 (int[], int)
Filler 类型中的方法 genFill(T[], T) 不适用于 pack.switchshift.Filler.main(Filler.java:11) 处的参数 (double[], double)

【问题讨论】:

  • 对于原始类型,您必须使用它们的盒装版本。
  • T 在这种情况下没有用;你的方法签名应该只是private static void genFill(Object[] arr, Object element)

标签: java arrays generics


【解决方案1】:

泛型并不总是适用于原始类型(我一直写是因为您可以将原始int 类型传递给T 类型的参数。其中int 将自动装箱为Integer)。你不能创建ArrayList&lt;int&gt;,同样你不能传递int[] 或任何其他需要T[] 数组的原始类型数组。您必须改为传递Integer[]。同样传递Double[] 而不是double[]

这样想,泛型方法被编译器编译为类型擦除方法。在这个过程中,这里的类型参数T被擦除到它最左边的绑定Object。所以,你编译后的方法相当于:

private static void genFill(Object[] arr, Object element)

现在,您可以理解,您不能在需要 Object[] 的地方传递 int[]

【讨论】:

  • '泛型并不总是适用于原始类型' 它适用于哪种原始类型??
  • @NiksTyagi 好吧,你可以传递一个原始 int,比如 0 到类型参数 T。它将被装箱到Integer
【解决方案2】:

只是不要使用原语。您可以这样做,因为T 实际上意味着某些对象将是 put 而不是 T,所以你应该使用原始包装器。

Integer [] intArr = new Integer [10];
String [] stringArr = new String[10];
Double [] doubleArr = new Double [10];

【讨论】:

  • 我按照您的建议对其进行了编辑,现在可以使用...希望这也是作业中实际要求的内容:)
【解决方案3】:

查看Arrays.fill 及其所有变体。

【讨论】:

  • Arrays.fill 为所有对象提供通用解决方案,并为所有原始类型提供重载版本。我想这就是你想要的。
猜你喜欢
  • 2020-09-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 2015-01-22
相关资源
最近更新 更多