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?