java - 填充数组的通用方法

标签 java arrays generics

我正在为学校学习 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;
        }
    }
}

我为此尝试了多种方法并花了几个小时进行研究,但我仍然没有明白。

Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method genFill(T[], T) in the type Filler is not applicable for the arguments (int[], int)
The method genFill(T[], T) in the type Filler is not applicable for the arguments (double[], double) at pack.switchshift.Filler.main(Filler.java:11)

最佳答案

泛型并不总是适用于基本类型(我一直写是因为你可以将原始 int 类型传递给类型为 T 的参数。其中 int 将自动装箱为 Integer )。您无法创建 ArrayList<int> ,同样你不能传递 int[]或任何其他基本类型数组,其中 T[]数组是预期的。你必须通过 Integer[]反而。同样通过 Double[]而不是 double[] .

这样想,泛型方法被编译器编译成类型删除的方法。在那个过程中,类型参数 T这里被删除到它最左边的边界 Object .因此,编译后的方法等同于:

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

现在,您可以理解不能传递 int[]哪里有Object[]是需要的。

关于java - 填充数组的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21971921/

相关文章:

java - Maven 缺少 MySQL 依赖项

arrays - Julia 中不同大小的数组列表

arrays - 从 Swift 中的单词中分离标点符号

c# - 通用列表 c#

swift - 访问通用属性

java - 什么是 .jspf 文件扩展名?如何编译它?

java - 对象不支持该属性或方法--在IE9中调用Applet

c++ - 我究竟做错了什么? (C++ 字符串)

ios - 使用通用协议(protocol),如何在一个 View Controller 中具有不同的关联值来确认协议(protocol)

java - Spring + Thymeleaf 验证动态生成的字段