【问题标题】:How to use an integer array as parameter for a generic array? [duplicate]如何使用整数数组作为泛型数组的参数? [复制]
【发布时间】:2021-11-20 20:17:33
【问题描述】:

所以我尝试了泛型(从一个迷你 C# 项目复制),现在有点傻眼了:

public static void main(String[] args) {
    Main main = new Main();

    // Strings
    {
        var array = new String[]{
                "test", "ok", "dog house banana"
        };

        main.PrintGenericList(main.ConvertArrayToList(array));
    }

    // Integers
    {
        var array = new int[] {
                55, 0, 100
        };
        main.PrintGenericList(main.ConvertArrayToList(array));
    }
}

private <T> List<T> ConvertArrayToList(T[] pArray) {
    return Arrays.asList(pArray);
}

private <T> void PrintGenericList(List<T> pList) {
    for (T item : pList) {
        System.out.println(item);
    }
    System.out.println();
}

我不明白为什么我不能在这里使用整数数组(即 ConvertArrayToList(myIntArray))。 返回的错误:

java:类 [已编辑] 中的方法 ConvertArrayToList。 Main 不能应用于给定类型;必需:T[] 找到:int[] 原因: 推理变量 T 具有不兼容的界限 等式约束:int 下界:java.lang.Object

【问题讨论】:

  • 您可能需要使用Integer[] 而不是int[]。在 Java 中,泛型和原语不能很好地协同工作。虽然 int 可以自动装箱为 Integer(反之亦然),但这不适用于数组。
  • Arrays.toList(new int[0])List&lt;int[]&gt;,而不是 List&lt;Integer&gt;
  • 顺便说一句,打印方法不需要类型变量:List&lt;?&gt;Object 循环变量就足够了。

标签: java generics collections


【解决方案1】:

使用Integer 会像这样工作:

var array = new Integer[] { 55, 0, 100 };

代替:

var array = new int[] { 55, 0, 100 };

原因:https://stackoverflow.com/a/2721557/11941108

TDLR:
泛型在运行时转换为objects。编译器负责正确转换对象。由于原始类型不能*转换为对象*,我们不能使用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 2021-10-23
    • 2021-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多