439 Stimmen

Methode hat die gleiche Löschung wie eine andere Methode des Typs

Warum ist es nicht zulässig, die folgenden zwei Methoden in derselben Klasse zu haben?

class Test{
   void add(Set<Integer> ii){}
   void add(Set<String> ss){}
}

Ich bekomme die compilation error

Die Methode add(Set) hat die gleiche Löschung add(Set) wie eine andere Methode des Typs Test.

Ich kann das zwar umgehen, aber ich habe mich gefragt, warum javac das nicht mag.

Ich kann mir vorstellen, dass die Logik dieser beiden Methoden in vielen Fällen sehr ähnlich ist und durch eine einzige Methode ersetzt werden könnte

public void add(Set<?> set){}

Methode, aber das ist nicht immer der Fall.

Dies ist besonders ärgerlich, wenn Sie zwei Personen haben möchten. constructors die diese Argumente aufnimmt, denn dann kann man nicht einfach den Namen einer der constructors .

3voto

rossoft Punkte 2154

Es könnte sein, dass der Compiler Set(Integer) in Set(Object) im Java-Bytecode übersetzt. In diesem Fall würde Set(Integer) nur in der Kompilierungsphase für die Syntaxprüfung verwendet werden.

3voto

Kote Isaev Punkte 307

Ich bin darüber gestolpert, als ich versucht habe, etwas zu schreiben wie: Continuable<T> callAsync(Callable<T> code) {....} y Continuable<Continuable<T>> callAsync(Callable<Continuable<T>> veryAsyncCode) {...} Sie werden für den Compiler zu den 2 Definitionen von Continuable<> callAsync(Callable<> veryAsyncCode) {...}

Das Löschen des Typs bedeutet buchstäblich das Löschen der Informationen über die Typargumente von Generika. Das ist SEHR ärgerlich, aber dies ist eine Einschränkung, die Java für eine Weile begleiten wird. Für Konstruktoren kann nicht viel getan werden, z.B. 2 neue Unterklassen, die mit unterschiedlichen Parametern im Konstruktor spezialisiert sind. Oder verwenden Sie stattdessen Initialisierungsmethoden (virtuelle Konstruktoren?) mit unterschiedlichen Namen...

für ähnliche Operationsmethoden wäre eine Umbenennung hilfreich, wie

class Test{
   void addIntegers(Set<Integer> ii){}
   void addStrings(Set<String> ss){}
}

Oder mit etwas beschreibenderen Namen, die sich selbst dokumentieren, wie addNames y addIndexes oder dergleichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X