2017-06-11 40 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

非常感謝! :) –

相關問題