Typecasts нельзя использовать динамически, как вы пытаетесь.Вот некоторые из проблем в том, что вы пытаетесь сделать:
(obj.getClass().getName()) obj;
"Материал" внутри скобок должен быть идентификатором , а не выражением .Этот идентификатор должен быть именем фактического класса или фактического интерфейса, который известен во время компиляции.Это не может быть идентификатор для переменной.Он даже не может быть идентификатором параметра типа.
(obj.getClass().getName) nameVariable = ...
Это просто неправильно.Не существует синтаксиса, который позволял бы вам использовать приведение типа в левой части присвоения, подобного этому.
Так что можно "подклассить" экземпляр, избегая использования instanceof
?
instanceof
НЕ используется для создания подклассов.Тип броска делает это!instanceof
фактически используется для различения подклассов.
Возможно (хотя, вероятно, не то, что вы хотите!) Различать без использования instanceof
.
Используйте switch
в имени класса:
switch (obj.getClass().getName()) {
case "a.b.Athletic1":
Athletic1 a1 = (Athletic1) obj;
// do stuff
break;
...
case "a.b.Athletic10":
Athletic10 a10 = (Athletic10) obj;
// do stuff
}
Проблема: у вас все еще есть шаблонный код для различения фиксированного числа случаев.
Используйте Map
.
Map<Class<?>, Consumer<?>> mapping = new Map<> {{
put(a.b.Athletic1.class,
o -> {
Athletic1 a1 = (Athletic1) o;
// do stuff
});
put(a.b.Athletic10.class,
o -> {
Athletic10 a10 = (Athletic10) o;
// do stuff
});
}};
Consumer<Object> c = mapping.get(obj.getClass());
if (c != null) {
c.accept(obj);
}
Преимущества:
- Карта может заполняться динамически.
- При необходимости
Consumer
объекты могут создаваться динамически как проксиклассы.(Хотя это дорого!)
Недостаток: все еще много шаблонного.
В то время как они избегают явного instanceof
, (IMO) этотак же плохо, как ваш существующий подход.«Запах кода» все еще существует.
IMO, реальным решением является использование полиморфизма Java.
Создание суперкласса / интерфейса commons для Athletic
classes.
Создайте метод в суперклассе / интерфейсе, который представляет действие
Реализуйте метод действия в каждом из Athletic
классы.
Позвони ...