Почему не законно иметь те два метода в том же классе?
class Test{
void add(Set<Integer> ii){}
void add(Set<String> ss){}
}
Я добираюсь compilation error
Метод добавляет (Набор) имеет то же стирание, добавляет (Набор) как другой метод в проверке печатания.
в то время как я могу работать вокруг этого, я задавался вопросом, почему javac не нравится это.
Я вижу, что во многих случаях, логика тех двух методов была бы очень похожа и могла быть заменена синглом
public void add(Set<?> set){}
метод, но это не всегда имеет место.
Это - дополнительное раздражение, если Вы хотите иметь два constructors
это берет те аргументы, потому что затем Вы не можете только изменить имя одного из constructors
.
Java generics использует стирание типа. Бит в угловых скобках (
и
) удаляется, таким образом, вы получаете два метода, которые имеют одинаковую сигнатуру (add(Set)
, который вы видите в ошибке). Это не разрешено, потому что время выполнения не будет знать, какой метод использовать для каждого случая.
Если Java когда-нибудь получит повторные генерики, то вы можете сделать это, но это, вероятно, маловероятно сейчас.
.Это потому, что Java Generics реализован с помощью Type Erasure.
Ваши методы будут переведены, во время компиляции, на что-то вроде:
Разрешение метода происходит во время компиляции и не учитывает параметры типа. (см. ответ Эриксона)
void add(Set ii);
void add(Set ss);
Оба метода имеют одну и ту же сигнатуру без параметров типа, отсюда и ошибка.
.Возможно, компилятор транслирует Set(Integer) в java-байтовый код. В этом случае Set(Integer) использовался бы только на этапе компиляции для проверки синтаксиса
. Проблема в том, что Set
и Set
на самом деле рассматриваются как Set
из JVM. Выбор типа для множества (String или Integer в Вашем случае) является только синтаксическим сахаром, используемым компилятором. JVM не может отличить Set
от Set
.