Namenskonflikt: Die Methode add (Object) vom Typ test2 hat die gleiche Löschung wie add (E) vom Typ HashSetE, überschreibt diese jedoch nicht

8

importieren Sie java.util. *;

%Vor%

Fehler: Namenskonflikt: Die Methode add (Object) vom Typ test2 hat die gleiche Löschung wie add (E) vom Typ HashSet, überschreibt diese jedoch nicht

Ich weiß nicht, was ist das Konzept hinter dem obigen Fehler kann jemand vorschlagen, wo ich dieses Konzept studieren kann?

    
user460293 07.01.2012, 07:05
quelle

3 Antworten

6

Das hier arbeitende Konzept heißt type löschen . HashSet definiert eine Methode add(T) und Sie definieren eine Methode add(Object) . Auf einen Blick könnte man meinen, das sei in Ordnung; dass Ihre Methode nur add überlädt. Das Löschen von T ist jedoch Object und so haben die beiden die gleiche gelöschte Signatur.

Nun, das wäre in Ordnung, wenn Ihre Methode die Methode von HashSet korrekt überschreiben würde. Dazu sollten Sie add(Integer) und nicht add(Object) verwenden. Sie überschreiben die übergeordnete Methode nicht ordnungsgemäß. Stattdessen wird sie als Konflikt gemeldet, da eine Klasse nicht zwei Methoden mit derselben Signatur bereitstellen kann.

Ihr Abc Beispiel folgt derselben Argumentation. Die beiden Methoden, die Sie deklariert haben, haben dieselbe gelöschte Signatur, so dass sie kollidieren.

Weiter lesen

Angelika Langer Generics FAQ

Mark Peters 07.01.2012, 07:32
quelle
1
%Vor%

Dieser Code funktioniert gut. In JLS: Der Begriff der Subsignatur soll eine Beziehung zwischen zwei Methoden ausdrücken, deren Signaturen nicht identisch sind, in denen jedoch die andere überschrieben werden kann. Insbesondere ermöglicht es eine Methode, deren Signatur keine generischen Typen verwendet, um generierte Versionen dieser Methode zu überschreiben. Dies ist wichtig, damit Bibliotheksdesigner Methoden unabhängig von Clients, die Unterklassen oder Subschnittstellen der Bibliothek definieren, frei generieren können.

    
Yan Yan 16.03.2012 00:59
quelle
-1

Haben Sie versucht, Integer anstelle von Object obj, d. h.

zu verwenden

public boolean add(Integer i) { //compiler error return true; }

Das Problem besteht darin, dass Sie beim Erweitern von Hashset Integer-Hashset und nicht die generische Form erweitern. In der Unterklasse muss Ihre add-Methode also der Signatur der Superklassenmethode entsprechen, die

ist

public boolean add (Ganzzahl i) {}

Wenn Sie von einer generischen Hashset-Implementierung ausschließen möchten, versuchen Sie, mit

zu erweitern %Vor%

}

Dann sollte Ihre Add-Methode mit Object funktionieren.

    
Sushant 07.01.2012 07:19
quelle

Tags und Links