2011-01-19 9 views
1

私はJavaプロジェクトのカスタムジェネリッククラスを作成したいと思いますが、これまでのところどのようになっていますか?ジェネリックアレイを作成する方法の例としてコードが見つかりました。今配列を持つ汎用クラス

public class RegisterSet<T> { 
    private T[] register; 
    public <T> RegisterSet(int size) { 
     register = (T[])Array.newInstance(T, size); 
    } 
} 

、私は私には全く意味がありませんエラーIncompatible types - found: T[], required: T[]を取得する - どのように私はこの問題を解決することができますか?

答えて

1

あなたはT.ためClassオブジェクトを含む変数を必要とし、これを移入する最も簡単な方法は、おそらくstaticファクトリメソッドです:

public class RegisterSet<T> { 
    public static <T>RegisterSet<T> create(Class<T> clazz, int size) { 
     return new RegisterSet<T>(clazz, size); 
    } 

    private T[] register; 

    @SuppressWarnings("unchecked") 
    private RegisterSet(Class<T> clazz, int size) { 
     if (clazz.isPrimitive()) throw new IllegalArgumentException("Cannot create a RegisterSet of primitives"); 
     register = (T[])Array.newInstance(clazz, size); 
    } 
} 

静的方法では、言うことができます

RegisterSet<String> x = RegisterSet.create(String.class, 42); 

これはslighですより短く繰り返しが少ない

RegisterSet<String> x = new RegisterSet<String>(String.class, 42); 
+0

@ ApoY2k、静的メソッドクラスの型パラメータ 'T'はスコープに含まれていません。 ''は戻り値の型ではなく、 'RegisterSet 'と同じ 'T'でもありません。新しい型の変数で、別の名前を付けることもできます。「このメソッドは、static RegisterSet create(Class clazz、int size)」または「static RegisterSet create(クラス clazz、int size)」として使用できます。 – finnw

4

あなたはTという2つの異なる型パラメータを持っているので理にかなっています。しかし、コードを固定するのは難しいです。このビットを考えてみましょう:

Tはメソッドの引数として使用できません。

タイプの削除のため、適切なタイプの配列を作成できるようにするには、関連するClassインスタンスを指定する必要があります。

public class RegisterSet<T> { 
    private T[] register; 
    public RegisterSet(Class<T> clazz, int size) { 
     register = (T[])Array.newInstance(clazz, size); 
    } 
} 

...しかし、私はあなたがここに使用しようとしているどのArrayクラスわからない:例えば。

0

そこには2つのバグがあります:

ファースト:クラスは、型Tを定義し、第二の方法は、それ自身の型Tを定義しませんが、お互いに行うには、両方のTのHASEの何も。 - ですから、メソッドの宣言から余分なタイプTを削除する必要があります。

public RegisterSet(int size) { 

の代わり:

public <T> RegisterSet(int size) { 

第二:Array.newInstanceは、その最初のパラメータとして、クラスのインスタンスを必要とする方法タイプTはクラスのインスタンスではありません。 - あなたが必要とするのは、コンストラクタの引数リストにClass型の新しいパラメータを組み込み、このパラメータを配列作成に使用することです。

少なくとも、すべて一緒に

は、次のようになります。

import java.lang.reflect.Array; 

    public class RegisterSet<T> { 
    private T[] register; 

    public RegisterSet(int size, Class<T> clazz) { 
     @SuppressWarnings("unchecked") 
     T[] register = (T[]) Array.newInstance(clazz, size); 
    } 
    } 

    ... 
    new RegisterSet<Integer>(5, Integer.class) 
+0

新しいオブジェクトの作成方法はどのようになりますか?私は'new RegisterSet(5、Integer)'しかしそれは動作しません(明らかに) - しかし、私はそれを正しく行うための例を見いだせませんでした。 –

+0

もちろん、それは動作しません:Integerはクラスのインスタンスではないので、Integer.classは次のように記述する必要があります: 'new RegisterSet (5、Integer.class)' – Ralph

関連する問題