2016-11-23 5 views
0

Я хотел бы переопределить абстрактный метод следующим образом:Java Дженерики Сопоставимые с наследованием

abstract <C extends Comparable<C>> Map<String, Function<E, C>> getSortingMap(); 

Метод перезаписаны выглядит следующим образом:

@Override 
Map<String, Function<Contract, Comparable<?>>> getSortingMap() { 
    final Map<String, Function<Contract, Comparable<?>>> map = new HashMap<>(); 
    map.put(Contract.APPRENTICE, e -> e.getApprentice().getLastName()); // String 
    map.put(Contract.COMPANY, e -> e.getCompany().getName()); // Name Object 
    map.put(Contract.EDUCATION_END, e -> e.getEducationEnd()); // Calendar 
    map.put(Contract.STATUS, e -> e.getStatus()); // ENUM 
    return map; 
} 

У меня есть предупреждение, я хотел бы пошла без Подавите потому что я предполагаю, что должно быть чистое решение:

Type safety: The return type Map<String,Function<Contract,Comparable<? 
    >>> for getSortingMap() from the type ContractIntegrationTest needs unchecked 
    conversion to conform to Map<String,Function<Contract,Comparable>> from the type 
    _AbstractFinderServiceIntegrationTest<Contract,ContractFilter,ContractSearch> 

Есть ли какой-нибудь способ?

ответ

0

Коротко: сделать свой абстрактный метод есть подпись:

abstract Map<String, Function<E, Comparable<?>>> getSortingMap();

Длинный ответ:

Глядя на подписи абстрактного метода, я не могу видеть, где параметр типа Е , поэтому я предполагаю, что это параметр типа класса.

abstract class MyClass<E>

и дочерний класс затем

class ChildClass extends MyClass<Contract>

Сказав, что подписи

<C extends Comparable<C>> List<C> doSomething();

и просто

List<Comparable<?>> doSomething();

вернуть разные вещи (здесь я использую списки вместо карт функций, как в вашем примере для простоты, идея такая же).

Для того, чтобы позвонить первым, вам необходимо передать точный тип сопоставимых. Так, например

List<String> stringList= doSomething();//method with <C>

Вы получаете список строк, можно добавить строки в него, удалить из него и т.д.

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

List<Comparable<?>> comparables = doSomething();//method with <?>

И вы можете добавить любой сравнимой там вы хотите. Вы не можете параметризовать его с помощью String. И если вы возьмете что-то из списка, вы получите Comparable<?> назад.

Вы не можете присваивать stringList сравнимым и наоборот - эти вещи просто разные.

Смежные вопросы