То же имя метода с EnumSet (другого типа) в качестве параметра
У меня есть метод А
@Deprecated
public void doSomething (EnumSet <TypeA> param){
}
Теперь я хочу написать новый метод B, который бы имел ту же сигнатуру, но принимает EnumSet другого типа.
public void doSomething(EnumSet <TypeB> param){
}
Когда я делаю это, затмение дает мне ошибку того же стирания. Есть ли способ решить эту цель? Заранее спасибо. Дайте мне знать, если вам нужно больше разъяснений.
2 ответа
Когда вы вызываете метод с EnumSet<SomeType>
личность SomeType
подвергается стиранию и не известен. Вы должны принять экземпляр SomeType
или же Class<SomeType>
чтобы избежать стирания:
private void doSomethingA(EnumSet<TypeA>){ ... }
private void doSomethingA(EnumSet<TypeA>){ ... }
private void <T extends Enum<T>> doSomething(EnumSet<T extends BaseType> s, T tInst){
if(t instanceof TypeA) doSomethingA(s);
if(t instanceof TypeB) doSomethingB(s);
}
Для удобства чтения я использую T
а также t
но это можно записать так:
private void <SOMETYPE extends Enum<SOMETYPE>> doSomething(EnumSet<SOMETYPE> s, SOMETYPE instanceOfSomeType){
if(instanceOfThatType instanceof TypeA) doSomethingA(s);
if(instanceOfThatType instanceof TypeB) doSomethingB(s);
}
Обратите внимание, что SOMETYPE
а также T
написаны как есть. Они являются заполнителями во время выполнения, но буквальными во время написания кода.
Поскольку компилятор Java имеет тип стирания, информация о типе среды выполнения неизвестна.
На самом деле происходит то, что оба метода компилируются в
public void doSomething(EnumSet<Object> param)
следовательно, у вас есть два метода с одинаковой подписью, это, очевидно, неверно, поскольку JDK не может решить, какой из них вызывать. Вы можете просто назвать их по-другому или использовать другую верхнюю границу.
Замените все параметры типа в универсальных типах их границами или Object, если параметры типа не ограничены. Таким образом, полученный байт-код содержит только обычные классы, интерфейсы и методы.