我的代码有一些问题。首先,我有一个接口:
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);
}
}
之后,我创建了Main Class和一个通用的静态方法,其中包含一个类似Class的方法。我想知道,有没有机会使用像Class这样的结构?我的MainClass
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);
}
}
发布于 2017-06-12 03:39:53
如果你想让这行工作,你可以这样做:
public static <T> T[] arr(T[] a, Class<? extends Generator<T, Integer>> typeToken) {
try {
Generator<T, Integer> gen = typeToken.newInstance();
for (int i = 0; i != a.length; i++) {
a[i] = gen.next(rand.nextInt(100));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return a;
}
基本上,对Class
的限制使得newInstance
返回的是一个Generator<T, Integer>
。
如何将两个参数传递给生成器?
不需要传递任何类型参数。因为Java泛型使用擦除,所以在运行时不需要具体的泛型类型参数。
如果您使用的是Java8,我建议您使用Supplier
而不是Class
,因为它允许您在不处理异常的情况下创建实例:
public static <T> T[] arr(T[] a, Supplier<? extends Generator<T, Integer>> typeToken) {
Generator<T, Integer> gen = typeToken.get();
for (int i = 0; i != a.length; i++) {
a[i] = gen.next(rand.nextInt(100));
}
return a;
}
..。
// passing reference to constructor of GenericClass
DemoClass[] myarr = arr(new DemoClass[10], GenericClass::new);
发布于 2017-06-12 03:09:48
不是的。
泛型只在编译时工作。在运行时,类的所有实例都是完全相同的,参数化类型的信息消失了。
这就是所谓的Java ,它的设计目的是确保Java1.4二进制文件与Java5VM兼容。
您可以通过在搜索框中搜索"type erasure java“来获取有关这方面的大量信息;例如Avoiding Java Type Erasure
https://stackoverflow.com/questions/44487627
复制相似问题