2017-06-11 42 views
1

我的代码存在一些问题。所有的 首先我有一个接口:我的项目是否有机会使用<?, ?>类?

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); 
    } 
} 

回答

-1

仿制药仅在编译时使用。在运行时,类的所有实例都完全相同,参数化类型的信息消失了。

这就是所谓的类型擦除它的设计目的是确保Java 1.4二进制文件与Java 5 VM兼容。

您可以通过在搜索框中搜索“type erasure java”来获得大量有关此信息;例如Avoiding Java Type Erasure

+0

谢谢!我会尽力去做。 –

0

如果你想使该行的工作,你可以这样做:

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泛型使用擦除,所以在运行时不需要具体泛型类型参数。


如果您使用的是Java 8,我会建议使用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); 
+0

非常感谢! :) –

相关问题