2013-07-11 7 views
5

私たちは、.NETでこれで逃げることができます。Javaが型パラメータに基づいてオーバーロードを許可しないのはなぜですか?</p> <pre><code>interface I<A> {} interface I<A, B> {} </code></pre> <p>を...しかし、Javaで、同じコードはコンパイルエラーになります:

実行時に型情報がなくなっても、型パラメータの数に関する情報がまだそこにあると考えれば、それは面白いです。

この制限がタイプ消去に関連する場合、誰かがその理由を説明できますか?

+0

制限事項は、インターフェイスを複数回定義することができないため、この方法でオーバーロードすることはできません。実行時に、タイプ消去は、 'I'が実際に許可されていない同じタイプか、技術的にはあなたが望むことをしないことを保証します。 –

答えて

6

raw typeを使用することから生じるであろう曖昧にほど消去を入力して関連していないです:

I eye = null; // which 'I' is it? 

生タイプは、JDK 5.0で導入されたジェネリック医薬品の前に書かれたコードに対応するために許可されています。

+0

問題は、それ自体が型消去ではなく、Javaが基本的に型引数としてObjectを暗黙的に渡すことになる生の型の使用を許可しているという事実だけですか? –

+0

.NETはどのようにこの問題を解決しますか?生の種類は許可されていませんか? – Thilo

+0

@JSmithはい実際に – arshajii

1

Javaでは、ジェネリッククラス/インターフェイスには固定数のジェネリックパラメータがあります。それは言語が定義されている方法です。

あなたがかもしれない話をしているものに最も近いもの:

interface I<A> {} 
interface J<A, B> extends I<A> {} 

Jのインスタンスは、まだタイプIの変数に代入されます。

関連する問題

 関連する問題