2017-06-11 4 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); 
    } 
} 

:すべての まず私はインターフェイスを持っています私はメインクラスと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

あなたはそのラインの仕事をしたい場合のために、あなたはこれを行うことができます:newInstanceによって返されるものGenerator<T, Integer>なるよう

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にバインドされ、それを作ります。

ジェネレータに2つのパラメータを渡すにはどうすればよいですか?

タイプパラメータを渡す必要はありません。 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

ありがとうございました! :) –

関連する問題

 関連する問題