4

Javaでオーバーロードメソッドを作成しようとしています:

private BasesResponse getResponse(List<ClassA> classA) {
...
}

private BasesResponse getResponse(List<ClassB> classB) {
    ...
}

しかし、日食は次のように不平を言っています: メソッドには、タイプ BasisInformationEndpoint の別のメソッドgetResponse(List<ClassA>)と同じ消去があります。getResponse(List<E>)

メソッドのシグネチャはメソッド名+パラメータリストだと思っていましたが、どうすれList<ClassA>ば同じになるのList<ClassB>でしょうか? 私には意味がありません。

4

8 に答える 8

5

Javaジェネリック型の消去はそれを行います

private BasesResponse getResponse(List classA) {
...
}

private BasesResponse getResponse(List classB) {
    ...
}

型消去後はコンパイラと同じです。

于 2013-06-20T09:04:11.260 に答える
2

ジェネリック型 ( <...>) はコンパイル段階の前にのみ存在し、静的型付けに使用されます。

コンパイルされると、これらの型は「消去」され、List<ClassA>本質的に になりListます。したがって、これが発生すると、2 つの関数が同一になることがわかります。

コメンターが言及しているように、これは型消去と呼ばれます。

于 2013-06-20T09:04:06.767 に答える
2

ジェネリック型消去:

この理由は実際にはジェネリックによるものでList<ClassA>あり、List<ClassB>Java 1.5 より前はジェネリックがなく、List がそのまま宣言されていました。そのままList。つまりObjectStringClassAListener、 などを 1 つのリストにのみ追加することが合法になる前に、指定されたリストに何でも入れることができます。コレクションが取得するタイプを指定するために、ジェネリックが導入されました。ここでList<ClassA>List<String>、 などが登場します。

ただし、ジェネリック以前にシステムを作成した人のレガシー システムを保持するためには、これが問題になります。ジェネリックはコンパイル時にのみ課されますが、実行時には以前と同じ基礎となるリストのままです。

あなたの質問に答えるために、Eclipse にとって、これは 1 つのパラメーターを受け取る同じメソッド シグネチャです。

private BasesResponse getResponse(List classX) { ... }

于 2013-06-20T09:06:38.163 に答える
1

これは、型消去を行った後、両方のメソッドが次のようになるためです。

private BasesResponse getResponse(List classA) {
...
}

private BasesResponse getResponse(List classB) {
    ...
}

同じ署名を持つ 2 つの同じメソッド。もちろん、これはオーバーロードではなく、コンパイル時エラーです。

于 2013-06-20T09:07:35.483 に答える
1

これは不可能です。下位互換性のために、汎用パラメーターは実行時に破棄されます (たとえば、C# とは異なります)。これを型消去と呼びます。

したがって、List<Whatever>は、実行時に単なるList. つまり、両方のメソッドに のプロトタイプがありBasesResponse getResponse(List)、これはコンパイル エラーです。

于 2013-06-20T09:04:24.413 に答える
0

Javaの場合、List<ClassA>およびList<ClassB>タイプ パラメータはList<E>.

この問題を解決するには、異なるメソッド名を使用するか、同じ親ClassAを持つ場合は を使用します。ClassBgetResponse(List<? extends ClassABParent> param)

于 2013-06-20T09:06:50.123 に答える
0

これは、コンパイラがまだレガシーコードをサポートしているためであり、それが考慮してジェネリック型を消去する理由です。同じ質問がここで回答されていることがわかります

于 2013-06-20T09:07:13.303 に答える