5

重複の可能性:
C#とJavaジェネリック

Java実行時に型情報を保持しながら型消去を使用C#しますが、この設計と言語の動作の実際的な違いは何ですか?

4

3 に答える 3

5

型消去には多くの問題があります。嫌な思い出がよみがえります。私は 1.6 以降 Java を使用していないため、これは古くなっている可能性がありますが、覚えていることがいくつかあります。

  1. 新しい T を作成することはできません (または、 T が実際にどのような型であるかを知る必要があることは何もできません)。
  2. ジェネリック リストは T の配列を作成できません
  3. Java のジェネリックで int、float などを使用することはできません
    1. 常にヒープ バージョン (整数など) を使用する必要があるため、これにはパフォーマンスとメモリへの影響があります。
  4. 2 つの異なる T を持つジェネリック インターフェイスを実装することはできません。たとえばclass c implements IComparable<MyClass>, IComparable<MyOtherClass>、不可能です。
    1. List<T1>より実際には、たとえば、などを取り込むことによって、異なるジェネリック型でメソッドをオーバーロードすることはできませんList<T2>。たとえば、Java -- コンストラクターでの型消去の処理方法は?
  5. すべてはキャストとボクシングによって行われます
于 2012-10-20T15:30:38.083 に答える
2

型情報が実行時に保持されている場合にのみ可能なことの例を次に示します。

public string DoSomething<T>()
{
    return typeof(T).Name;
}

Javaで取得できる最も近いものは、次のようなものです。

public <T> string DoSomething(Class<T> theClass)
{
    return theClass.getName();
}
于 2012-10-20T15:22:49.350 に答える
1

型の消去が原因で Java で発生するのは、「ブリッジ メソッド」と呼ばれる合成メソッドの作成です。

これは通常、パラメータ化されたクラスを拡張するか、パラメータ化されたインターフェースを実装するクラスまたはインターフェースを Java がコンパイルしようとしたときに発生します。この場合、Java コンパイラは、スタック トレースに表示される型消去プロセスの一部として合成メソッド (ブリッジ メソッド) を作成する必要がある場合があります。

コンパイラは、型消去プロセス後にジェネリック型のポリモーフィズムを保持するためにこれを行います。

Java のドキュメントには例があります。

于 2012-10-20T15:29:55.377 に答える