Name-Konflikt beim Überschreiben der Methode der generischen Klasse

Ich versuche, den Namensüberschneidungsfehler zu verstehen, den ich mit dem folgenden Code erhalte:

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) {
    }
}

Fehlermeldung

Fehler: Namenskonflikt:doSomething(Number,Map<String,JComponent>) imBar unddoSomething(Number,Map<String,JComponent>) imFoo habe die gleiche Löschung, aber keine überschreibt die andere

Ich weiß, dass ich das Problem beheben kann, indem ich entweder den generischen Typ aus @ entfernFoo oder durch Ändern desBar Deklaration anclass Bar extends Foo<Integer>; Ich möchte wissen, warum dieser Fehler im konkreten Fall auftritt, aber er verschwindet, wenn ich das @ entferncomps Parameter von jeder Methode. Ich habe etwas über @ gelestype erasure, aber es scheint mir immer noch, dass beide Methoden mit oder ohne Generika die gleiche Löschung haben und daher in beiden Fällen eine gültige Überschreibung sein sollten. (Beachten Sie, dass ich den generischen Parameter noch nicht einmal verwendet habe, weshalb ich so überrascht bin.)

Ich weiß, dass ich Elternklassen zuvor generische Typen hinzugefügt habe, aber nur Warnungen über die Unterklassen erhalten habe, keine Fehler. Kann mir jemand dieses Szenario erklären?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage