コンパイラエラーは、[Java123]遭遇のオーバーロード方法:両方のメソッドが同じ消去を持っている=> Javaは、ジェネリック型消去を導入しました

シーン:

ときにオーバーロードされた関数を以下のように二つのパラメータ

ボイドFUNC(MAP <整数、文字列>マップ){}

空FUNC(地図<整数、リスト<文字列>>マップ){}

IDEは、コンパイルエラーを報告します。どちらの方法も同じ消去を持っています

 

回答:

Javaのジェネリックは、コンパイル時にタイプを消去した後、上記の方法になるだろうので、

空FUNC(地図マップ)

 

 

ビットを照会し、理解し、マスターするために必要ないくつかの概念があります。

https://www.jianshu.com/p/f9da328c91be

C ++でのJavaのジェネリックは異なるテンプレート:Javaのジェネリックは、「型消去」で、C ++のテンプレートは、「ジェネリックを具体化」されています

  • 型消去:ジェネリック型はコンパイル時にのみ存在する、コンパイル済みのバイトコードは、同じ一般的なタイプの1バイトコードへのすべてのマップを、一般的な情報やランニングが含まれていません。
  • 一般的な具体化:コンパイルと実行の間に存在ジェネリック型、コンパイラが自動的にコードの各タイプのための一般的な種類を生成し、バイナリコードにコンパイル。

 

型消去の性質

ジェネリック(T) - >コンパイラ(タイプ消去) - >オリジナルタイプ(T、オブジェクトによって置き換え)
ジェネリック(XXXを拡張?) - >コンパイラ(タイプ消去) - >オリジナルタイプ(TはXXXであります代替的に)
元の型は、可変バイトコードの特定の型の型、ジェネリック情報はコンパイラ後に消去されることをいいます。

ジェネリック型消去の限界が生じ

ジェネリック型消去の一般化を減らす、特定の重要な文脈ジェネリック型にはいくつかの制限で、使用することはできません。
 
 

暗黙的な型変換実行時のオーバーヘッド:ジェネリック医薬品の使用、Javaコンパイラが自動的に私たちはC ++テンプレートへの相対的な変換を、入力を支援するコードを生成するには、間違いなく、追加のパフォーマンス・オーバーヘッドをもたらしています。

オーバーロードメソッドのシグネチャの競合

クラスは、汎用インタフェースの二つの変種では達成できません

 

 

https://blog.csdn.net/abc_12366/article/details/79177328

https://blog.csdn.net/weixin_34121282/article/details/88535522  地図ジェネリック

 

おすすめ

転載: www.cnblogs.com/cathygx/p/11365253.html