在编写以下代码时,我会遇到问题 它是在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];**
}
}
}
我收到了Generics数组创建错误
答案 0 :(得分:2)
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);
第一种方法使用弱类型 - 不对作为参数传递的任何对象执行检查。第二种方式使用强类型 - 如果尝试传递不同类的参数,则会抛出异常,但在创建数组之前必须在运行时知道组件类型
答案 1 :(得分:1)
在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] ;
不通常有效。