2017-11-05 20 views
0

私はNode<E>という汎用クラスを持っていますが、このタイプのオブジェクトの配列を返す静的メソッドを定義しようとしています。私はJavaがクラス内でジェネリック型の配列の作成を許可しないので、オブジェクト配列を作成してジェネリック型をオブジェクトに渡す必要があることを理解しています。コードの例についてはオブジェクト内の汎用クラスの呼び出しメソッド[]配列

、のようにそれを定義してみましょう:内のオブジェクトに、このクラスのメソッドを実行

  • :私はこのコードを実装するとき、私はすることはできませんよ

    public static Object[] returnArray() { 
        Object[] output; 
        //code which adds Node<E> to output 
        return output; 
    

    それらの型の配列Object

    • Node<E>のメソッドが.getVal()の場合、次のコードはエラーになります。012 Object[] nodes = Node.returnArray(head); nodes[0].getVal();
  • Node<E>[]配列へのキャストとリターン方式の配列、場合でも、タイプの明示。
    • Node<Integer>[] nodes = (Node<Integer>[]) Node.returnArray(head);

だから私は現在、各ノードのメソッドにアクセスしています唯一の方法は、鋳造によって変数に割り当てることである:

Object[] nodes = Node.returnArray(head); 
Node<Integer> returned1 = (Node<Integer>) nodes[0]; 
Node<Integer> returned2 = (Node<Integer>) nodes[1]; 

しかし、あなたはどのように見ることができますコードが大きくなると冗長になります。配列に渡される汎用オブジェクトにアクセスするには、より良い方法がありますか?

+3

'E'の配列や' Node 'の配列を作ることはできませんが、確かに' Node'の配列を作ることができます。 – user2357112

+5

また、代わりにListを作成するほうがよいでしょう。あなたがリストを使うことができるだけであれば、ジェネリックとアレイを連携させようという頭痛に対処することはできません。 – user2357112

+1

'Node'の配列を作成し、それを' Node [] 'にキャストし、あなたのメソッドに警告抑制を追加することができます。確かにそれが本当に 'E'(多くの場合、難しくない)であることを確認するあなたの処分だと確信しています。 – HuStmpHrrr

答えて

0

ジェネリックアレイを作成します。そのためにはClassオブジェクトが必要です。数6を印刷するために、この過度に複雑なプログラムを考えてみましょう:それは使用しても、外部化しても安全ですので

public class GenericClass<T> { 

    T[] array; 

    public GenericClass(int length, Class<T> clazz) { 
     array = (T[]) java.lang.reflect.Array.newInstance(clazz, length); 
    } 

    public T get(int i) { 
     return array[i]; 
    } 

    public T set(int i, T val) { 
     return array[i] = val; 
    } 

    public static void main(String... args) { 
     GenericClass<Integer> example = new GenericClass<>(5, Integer.class); 
     example.set(0, 6); 
     System.out.println(example.get(0)); //Prints 6 
    } 
} 

この方法では、作成した配列は、タイプT[]、ないObject[]本当にです。 もう一つの選択肢はもちろん、リストを使うことです。

+0

ここでは関係ありません。彼らは型変数型の配列を作成しようとしていません。ここの配列のランタイムコンポーネント型は、コンパイル時に*知られています。これは 'Node'です。 – newacct

関連する問題