重複の可能性:
C#とJavaジェネリック
Java
実行時に型情報を保持しながら型消去を使用C#
しますが、この設計と言語の動作の実際的な違いは何ですか?
重複の可能性:
C#とJavaジェネリック
Java
実行時に型情報を保持しながら型消去を使用C#
しますが、この設計と言語の動作の実際的な違いは何ですか?
型消去には多くの問題があります。嫌な思い出がよみがえります。私は 1.6 以降 Java を使用していないため、これは古くなっている可能性がありますが、覚えていることがいくつかあります。
class c implements IComparable<MyClass>, IComparable<MyOtherClass>
、不可能です。
List<T1>
より実際には、たとえば、などを取り込むことによって、異なるジェネリック型でメソッドをオーバーロードすることはできませんList<T2>
。たとえば、Java -- コンストラクターでの型消去の処理方法は?型情報が実行時に保持されている場合にのみ可能なことの例を次に示します。
public string DoSomething<T>()
{
return typeof(T).Name;
}
Javaで取得できる最も近いものは、次のようなものです。
public <T> string DoSomething(Class<T> theClass)
{
return theClass.getName();
}
型の消去が原因で Java で発生するのは、「ブリッジ メソッド」と呼ばれる合成メソッドの作成です。
これは通常、パラメータ化されたクラスを拡張するか、パラメータ化されたインターフェースを実装するクラスまたはインターフェースを Java がコンパイルしようとしたときに発生します。この場合、Java コンパイラは、スタック トレースに表示される型消去プロセスの一部として合成メソッド (ブリッジ メソッド) を作成する必要がある場合があります。
コンパイラは、型消去プロセス後にジェネリック型のポリモーフィズムを保持するためにこれを行います。
Java のドキュメントには例があります。