java是否有机会使用类<?,?>我的项目?
我的代码有一些问题。 首先,我有一个界面:
public interface Generator <T, R> {
public T next (R x);
}
然后,我创建了类“DemoClass”
public class DemoClass {
private int id;
public DemoClass (int id){
this.id = id;
}
}
而且。。。泛型类也是如此
public class GenericClass implements Generator <DemoClass, Integer> {
public DemoClass next(Integer x) {
return new DemoClass (x);
}
}
之后,我创建了一个主类和一个泛型静态方法,其中包含一个类似类的方法。我想知道,有没有机会使用这样的建筑类课程??? 我的主课
import java.util.*;
public class MainClass {
private static Random rand = new Random ();
public static <T> T [] arr (T [] a, Class <?> typeToken){
try{
Generator <?, ?> gen = (Generator <?, ?>)typeToken.newInstance(); // How can I pass two paramets to Generator <?, ?>???
for (int i=0; i!=a.length; i++){
a[i] = (T) gen.next(rand.nextInt(100)); // This line does not work!
}
} catch (Exception e){
throw new RuntimeException (e);
}
return a;
}
public static void main (String [] args){
DemoClass [] myarr = arr (new DemoClass[10], GenericClass.class);
}
}
# 1 楼答案
没有
泛型只能在编译时工作。在运行时,类的所有实例都完全相同,参数化类型的信息消失了
这被称为类型擦除,其设计目的是确保Java 1.4二进制文件与Java 5 VM兼容
通过在搜索框中搜索“type erasure java”,你可以获得很多关于这方面的信息;例如Avoiding Java Type Erasure
# 2 楼答案
如果你想让这条线发挥作用,你可以这样做:
基本上,
Class
上的界使得newInstance
返回的是Generator<T, Integer>
不需要传递任何类型参数。因为Java泛型使用擦除,所以在运行时不需要具体的泛型类型参数
如果您使用的是Java 8,我建议使用
Supplier
而不是Class
,因为它允许您创建实例,而不必处理异常: