2011-09-11 16 views
3

一般的な頂点と隣接リストを持つGraphクラスを作成しようとしていますが、次のコードの10行目で一般的な配列作成エラーが発生しています。以前私は11行目で同じエラーが発生していましたが、キャストによって解決されました。しかし、このエラーは残っています。コードの何が間違っていますか?一般的な配列作成エラー

import java.util.HashSet; 

public class Graph<T> { 
    private int numVertices; 
    private T[] vertex; 
    private HashSet<T>[] adjacent; 

    public Graph(int numVertices) { 
      this.numVertices = numVertices; 
      vertex = (T[]) new T[numVertices]; 
      adjacent = (HashSet<T>[]) new HashSet[numVertices]; 
    } 
} 
+3

@downvoter:なぜそれがダウンvotedですか?私はこの質問の問題を見ることができません! – home

答えて

1

アレイとコレクションを混在させないでください。コレクションを使用する:

リストの実装としてArrayListを使用することができます。それは効率的で柔軟なものと同じです。

+0

ありがとうございました。現在は、チェックされていない/安全でない操作の警告だけが表示されます。 –

2

タイプ消去のため、汎用配列をJavaで作成することはできません。

ただし、Array.newInstance(Class<T>, int)を使用して作成することができます。返されたObjectT[]にキャストする必要があります。

/e1
これはまだClass<T>オブジェクトを取得する問題を残します。これを行うための最良の方法(私が考えることができる唯一の方法)は、コンストラクタにクラスオブジェクトを取る別のパラメータを持たせることです。

+0

http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ202 –

1

不明な型の配列を作成することはできません(実行時に配列にコンポーネント型が含まれているため)。しかし目的のためには、任意のオブジェクトを含むことができるObject[]を作成するだけです。

次の2つのオプションがあります。

  1. タイプObject[]の変数を使用します。要素を取り出してTとして使用する場合は、Tにキャストする必要があります。
  2. タイプT[]vertex = (T[]) new Object[numVertices];)の変数を使用します。これは、あなたが物事を得るときにTにキャストする必要がないという利便性を持っています。ただし、この参照をクラス外のコードT[]が必要なクラスに渡さないようにする必要があります。クラスキャスト例外が発生します。
関連する問題