У меня есть интерфейс:
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». По какой причине я получаю это?




<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>;
}