Параметр скрывает тип

У меня есть интерфейс:

public interface Handler {
public <T> boolean shouldProcess(final T obj);

и реализация:

public class SampleHandler implements Handler {
@Override
public <Long> boolean shouldProcess(final Long date) {
 return <some comparison>;
}

Я получаю сообщение «Параметр типа Long скрывает тип Long». По какой причине я получаю это?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
323
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

<Long> - это параметр универсального типа, который имеет то же имя, что и класс java.lang.Long. Следовательно, он скрывает этот класс, поэтому аргумент (final Long date) вашего метода имеет общий тип, а не тип java.lang.Long.

Если вы хотите, чтобы SampleHandler реализовал Handler с использованием java.lang.Long в качестве параметра универсального типа, я предлагаю вам переместить параметр типа на уровень интерфейса / класса:

public interface Handler<T> {
    public boolean shouldProcess(final T obj);
}

public class SampleHandler implements Handler<Long> {
    @Override
    public boolean shouldProcess(final Long date) {
        return <some comparison>;
    }
}
Ответ принят как подходящий

Потому что вы не создаете экземпляр T с конкретным типом Long; вы фактически объявляете переменную нового типа с именем Long, которая имеет то же имя, что и обычные Long, и, таким образом, затеняет их. Я подозреваю, вы имели в виду:

public interface Handler<T> {
  public boolean shouldProcess(final T obj);
}

public class SimpleHandler implements Handler<Long> {
  @Override
  public boolean shouldProcess(final Long date) {
    ...
  }
}

Long или java.lang.Long - это встроенный класс.

Старайтесь не использовать универсальные типы, пользовательские классы или переменные, имена которых совпадают с именами общих классов.

Скорее всего, вы хотите иметь обработчик, который знает его тип, в противном случае это почти то же самое, что и использование Object.

public interface Handler<T> {
    public boolean shouldProcess(final T obj);

public class SampleHandler implements Handler<Long> {
    @Override
    public boolean shouldProcess(final Long date) {
        return <some comparison>;
    }

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