Метод имеет то же стирание как другой метод в типе

Почему не законно иметь те два метода в том же классе?

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

Я добираюсь compilation error

Метод добавляет (Набор) имеет то же стирание, добавляет (Набор) как другой метод в проверке печатания.

в то время как я могу работать вокруг этого, я задавался вопросом, почему javac не нравится это.

Я вижу, что во многих случаях, логика тех двух методов была бы очень похожа и могла быть заменена синглом

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

метод, но это не всегда имеет место.

Это - дополнительное раздражение, если Вы хотите иметь два constructors это берет те аргументы, потому что затем Вы не можете только изменить имя одного из constructors.

359
задан Mithun 30 May 2015 в 10:38
поделиться

4 ответа

Java generics использует стирание типа. Бит в угловых скобках ( и ) удаляется, таким образом, вы получаете два метода, которые имеют одинаковую сигнатуру (add(Set), который вы видите в ошибке). Это не разрешено, потому что время выполнения не будет знать, какой метод использовать для каждого случая.

Если Java когда-нибудь получит повторные генерики, то вы можете сделать это, но это, вероятно, маловероятно сейчас.

.
113
ответ дан 23 November 2019 в 00:19
поделиться

Это потому, что Java Generics реализован с помощью Type Erasure.

Ваши методы будут переведены, во время компиляции, на что-то вроде:

Разрешение метода происходит во время компиляции и не учитывает параметры типа. (см. ответ Эриксона)

void add(Set ii);
void add(Set ss);

Оба метода имеют одну и ту же сигнатуру без параметров типа, отсюда и ошибка.

.
44
ответ дан 23 November 2019 в 00:19
поделиться

Возможно, компилятор транслирует Set(Integer) в java-байтовый код. В этом случае Set(Integer) использовался бы только на этапе компиляции для проверки синтаксиса

.
3
ответ дан 23 November 2019 в 00:19
поделиться

Проблема в том, что Set и Set на самом деле рассматриваются как Set из JVM. Выбор типа для множества (String или Integer в Вашем случае) является только синтаксическим сахаром, используемым компилятором. JVM не может отличить Set от Set.

.
21
ответ дан 23 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: