Дженерики в Java - стирание типа с абстрактным классом

У меня есть общий класс:

public class MyGenericClass<T> {
   T get(){
     return T;
    }
   ...
}

Есть 2 класса:

public class CatService{
   MyGenericClass<Cat> generic;

   public CatService(MyGenericClass<Cat> generic){
   this.generic = generic;
   }
}

public class DogService{
   MyGenericClass<Dog> generic;

   public DogService(MyGenericClass<Dog> generic){
   this.generic = generic;
   }
}

Думаю лучше создать public abstact class Service:

public abstract class Service {
   MyGenericClass generic;

   public MyGenericClass (MyGenericClass generic){
   this.generic = generic;
   }
}

И сделайте CatService и Собачья службапродлевать этим абстрактный сервис. Они инициализируют универсальное поле в конструкторе, вызывая супер (общий MyGenericClass) или супер (общий MyGenericClass).

Но в этом случае, когда я пытаюсь вызвать методы MyGenericClass, я получаю "неотвеченный звонок", когда я пытаюсь вызвать T get(), я должен использовать (Кот) generic.get() ИЛИ (Собака) generic.get();

Можно ли этого избежать?

Обновлено: Необходимо указать общий тип: extends Service<Cat>

public class CatService extends Service<Cat> {

   public CatService(MyGenericClass<Cat> generic){
   super(generic);
   }
}

public abstract class Service<T> {
   MyGenericClass<T> generic;

   public MyGenericClass (MyGenericClass<T> generic){
   this.generic = generic;
   }
}

Вам также необходимо сделать родительский класс службы универсальным.

Hovercraft Full Of Eels 09.03.2019 21:02
public abstract class Service<T> { MyGenericClass<T> generic;
Hovercraft Full Of Eels 09.03.2019 21:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Также сделайте класс Serviceобщий.

public abstract class Service<T> {
   MyGenericClass<T> generic;

   public MyGenericClass (MyGenericClass<T> generic){
       this.generic = generic;
   }
}

Да, что он (Эллиот) сказал

Hovercraft Full Of Eels 09.03.2019 21:04

Я пробовал. Это не работает, когда я использую универсальный в DogService или CatService. Все еще есть «незаблокированный вызов».

Donatello 09.03.2019 21:11

Другие вопросы по теме