2016-05-22 6 views
0

oracle docは、ジェネリックはテクニック・コール・タイプの消去を使ってjavaで実装されていると言います。Javaタイプの消去と配列

  1. 型パラメータが無制限であれば、その境界またはオブジェクトとジェネリック型のすべての型パラメータを交換してください。したがって、生成されるバイトコードには、通常のクラス、インタフェース、およびメソッドのみが含まれます。
  2. 型の安全性を維持するために、必要に応じて型キャストを挿入します。
  3. 拡張ジェネリック型で多型を保持するためのブリッジメソッドを生成します。だから、

私は、ジェネリッククラスを持っているとして、以下のコンテナを言う場合:

class Container<T>{ 
T initialValue; 
List<T> valueList=new ArrayList<T>(); 
public List<T> getValueList(){ 
    return valueList; 
} 

} 

それは同等のクラスは型消去によって処理された後、次のようになります:間違った場合

class Container{ 
    Object initialValue; 
    List valueList=new ArrayList(); 
    public List getValueList(){ 
     return valueList; 
    } 

    } 

は私を修正ここに

同様に、上記のクラスを以下のように変更する場合

class Container<T>{ 
    T initialValue; 
    List<T> valueList=new ArrayList<T>(); 
    T[] arrayValue; 
    public Container(T[] array){ 
     arrayValue=array; 
    } 
    public List<T> getValueList(){ 
     return valueList; 
    } 

    } 

は、これに相当するでしょうか?

class Container{ 
    Object initialValue; 
    List valueList=new ArrayList(); 
    Object[] arrayValue; 
    public Container(Object[] array){ 
     arrayValue=array; 
    } 
    public List getValueList(){ 
     return valueList; 
    } 

    } 

これが本当であるならば、私はこのようにも持っている必要があります。 T[] arrayValue=new T[10]; //時間のコンパイルエラーが発生しました。上記のステートメントとして は

Object[] arrayValue=new Object[10]; 

型消去は、Javaでの配列のためにどのように機能するかを明確にする必要

に変換になるだろう?

+0

で、あなたが見ているエラーは何ですか具体的にはどのようなコードですか?あなたが求めていることは本当にはっきりしません。 – pvg

+0

なぜT [] arrayValue = new T [10];許可されていません。なぜパラメータ化された型の配列Objectを作成できないのですか? –

答えて

1

汎用アレイを作成することはできません。その理由は、配列はJavaのジェネリックよりも先行しており、配列は型の消去を使用していないからです。したがって、例えば、Integer[]String[]は実際には実行時に異なる型を持っています。 new T[]と記述すると、コンパイラはどのような配列を作成する必要があるのか​​分かりません。

あなたが行うことで、偽の一般的な配列を作成することができます

T[] array = (T[]) new Object[10]; 

しかし、あなたは本当にObject配列ではなく、T配列を作成したことを覚えておく必要があります。実行時に非Tのインスタンスを入れることができます。したがって、配列が他のオブジェクトに渡されることのないクラスのプライベートフィールドである場合にのみこれを実行します。アレイ。

あなたはClass<T>インスタンス(いわゆるタイプのトークンを)持っている場合は、正しい実行時の型で新しい配列を作成するためにArray.newInstanceを使用することができます。

T[] array = (T[]) Array.newInstance(typeToken, 10); 
+0

したがって、タイプ消去は配列では機能しませんか? –

+0

いいえ、タイプ消去は配列では機能しません。実行時に 'List 'と 'List 'は同じ型、つまり 'List'を持ちますが、' Integer [] 'と' String [] 'は*異なる*型を持っています。 – Hoopje

関連する問題