次のコードで発生する名前衝突エラーを理解しようとしています。
import java.util.*;
import javax.swing.*;
class Foo<R extends Number> {
public void doSomething(Number n, Map<String, JComponent> comps) {
}
}
class Bar extends Foo {
public void doSomething(Number n, Map<String, JComponent> comps) {
}
}
エラーメッセージ:
エラー: 名前の衝突:
doSomething(Number,Map<String,JComponent>)
inBar
とdoSomething(Number,Map<String,JComponent>)
inFoo
の消去は同じですが、どちらも他方をオーバーライドしません
からジェネリック型を削除するか、宣言を;Foo
に変更することで修正できることはわかっています。私が知りたいのは、特定のケースでこのエラーが発生する理由ですが、各メソッドからパラメーターを削除すると消えることです。タイプ eraserについていくつか読んだことがありますが、ジェネリックの有無にかかわらず両方のメソッドが同じ消去を行う必要があるため、どちらの場合でも有効なオーバーライドになるように見えます。(ジェネリック パラメータをまだどこでも使用していないことに注意してください。そのため、非常に驚いています。)Bar
class Bar extends Foo<Integer>
comps
以前にジェネリック型を親クラスに追加したことは知っていますが、サブクラスに関する警告のみが表示され、エラーは表示されませんでした。誰でもこのシナリオを説明できますか?