【问题标题】:Generics Array Creation [duplicate]泛型数组创建[重复]
【发布时间】:2013-09-06 06:47:55
【问题描述】:

在编写以下代码时,我在以下行遇到问题 它在 netbeans 中。是否接受数组声明。如果接受,那么为什么

的异常
      Exception in thread "main" java.lang.RuntimeException: Uncompilable source code generic array creation
            at mygenerics.Addition.<init>(MyGenerics.java:26)
at mygenerics.MyGenerics.main(MyGenerics.java:16)
    Java Result: 1

在这里编程

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
 */
package mygenerics;

/**
 *
 * @author SUMIT
 */

public class MyGenerics {

public static void main(String[] args)
{
    Addition<Integer> ints = new Addition<>(1,2,3);
    ints.sum();
    Addition<Double> dbls = new Addition<>(1.25,2.68,3.49);
    dbls.sum();
    System.out.println(ints.toString());
}

}
class Addition<T extends Number>
{
    **T arr[]=new T[10];**
public Addition(T... values)
{
   for(int j=0;j<values.length;j++)
   {
       int i=0;
       arr[i]=values[j];
       i++;
   }
   System.out.println(arr);
}
public <T extends Number> void sum()
{
    T sum;
    System.out.print(arr);
    for(int i = 0;i<arr.length;i++)
    {
      **sum = sum + this.arr[i];**
    }

}
}

我收到泛型数组创建错误

【问题讨论】:

  • 查看右侧“相关”侧边栏中的第一个答案

标签: java generics


【解决方案1】:

TGeneric 数组不能在 Java 中直接创建,因为 Java 在运行时必须知道组件类型,而泛型由于类型擦除在运行时不知道它们的类型

T[] genericArray = (T[]) new Object[];

这是一个更好的方法:

// Use Array native method to create array of a type only known at run time
T[] genericArray  = (T[]) Array.newInstance(componentType,length);

第一种方法使用弱类型 - 不对作为参数传递的任何对象执行任何检查。第二种方式使用强类型——如果你尝试传递不同类的参数会抛出异常,但在创建数组之前你必须在运行时知道组件类型

【讨论】:

  • 这也不是正确的方法。
  • @RohitJain 我想他想展示一个错误代码的例子?
【解决方案2】:

在 Java 中创建泛型数组的最佳(类型安全)方法是:

    T[] result= (T[])Array.newInstance(ElementType.class,size);

应用于您的代码,这将是:

    public Addition(Class<T> cls,T... values) {
        this.arr= (T[])Array.newInstance(cls,10);
        ...
    }

然后调用:

    Addition<Integer> ints= new Addition<>(Integer.class,1,2,3) ;
    Addition<Double> dbls= new Addition<>(Double.class,1.25,2.68,3.49) ;

形式:

    T[] result= (T[])new Object[size] ;

通常有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2013-05-05
    相关资源
    最近更新 更多