【问题标题】:Why does Java generics not allow type conversion on generic types?为什么 Java 泛型不允许对泛型类型进行类型转换?
【发布时间】:2016-07-12 20:13:46
【问题描述】:
public class Main {

    public static <T> void foo(T[] bar) {
        double d = (double) bar[0]; // Error : incompatible types
    }

    public static void main(String[] args) {
        int[] int_buf = new int[8];
        foo(int_buf);
    }
}

代码中指出了问题。

为什么 Java 泛型不允许对泛型类型进行类型转换?

【问题讨论】:

    标签: java generics type-conversion


    【解决方案1】:

    问题比这更深。即使没有您突出显示的行,该程序也已损坏:

    public class Main {
        public static <T> void foo(T[] bar) {
            // do nothing
        }
    
        public static void main(String[] args) {
            int[] int_buf = new int[8];
            foo(int_buf);   <-- problem is here
       }
    }
    

    Java 泛型只支持引用类型作为类型参数;通用方法 foo() 可以重写如下:

    <T extends Object> void foo(T[] bar) { ... }
    

    这就是你的问题:没有T 扩展Object 使得int[]T[]

    其次,转换失败的原因是我们对T一无所知,所以我们不知道存在从Tdouble的转换。

    【讨论】:

      【解决方案2】:

      Java 编译器会删除泛型代码中的所有类型参数。这样做的直接后果是您无法验证当前使用的是泛型的哪个参数化类型。如果您进行测试,instanceof 也将不起作用。由于运行时不跟踪 java 中的类型参数,HashSet&lt;Integer&gt;HashSet&lt;Double&gt; 之间没有区别。你最多可以做一个..instanceof HashSet&lt;?&gt; 来检查它是否是一个HashSet的实例。

      如果我写的内容有什么不清楚的地方,请参考docs

      【讨论】:

      • 这个答案是正确的,但我看不出它回答了这个问题。
      【解决方案3】:

      这是因为您没有指定泛型类型T 是什么。所以默认情况下它会认为 T 是一个对象类型,而不是一个数字。无法将对象强制转换为双精度对象,这是没有意义的。

      如果您更改为&lt;T extends Number&gt;,这应该可以正常工作。虽然,您可能需要一个 Integer 数组而不是 int 数组

      【讨论】:

      • 如果给定的数组已经是int[]而不是Integer[],有什么办法让它工作吗?
      • 很高兴&lt;T extends Number&gt; 会起作用;来自我的 +1
      • @xmllmx 它不起作用,因为int 是原始类型而不是对象类型。
      • @xmllmx 看看下面的链接。如果您使用的是 Java 8,则可能可以轻松完成。但是我很确定无论如何都会复制内存,这是无法解决的。 stackoverflow.com/questions/880581/…
      • 我很好奇问题的标题并进来了,但不知道这个问题和接受的答案在说什么。如果我错了纠正我。我认为问题是由@Satya 描述的,而不是关于泛型类型的类型转换,如果int_bufInteger 的数组而不是int,我可以编译并运行它。而且我根本不需要使用&lt;T extends Number&gt;
      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多