Универсальный тип Java не работает в этом случае

Этот класс отображает информацию:

// display line numbers from a file 
display(getLineNumber(myFile));

// display users from DB
display(getUsersName(myDBRepository));

и т.д ...

Я хотел создать общий интерфейс, чтобы я мог выводить код, отображающий информацию.

Тогда я мог бы сделать что-то вроде:

myInformationElements.stream().forEach(e -> display(e.getValue());

Вот что у меня пока (не работает):

public interface InformationElement {
    public <T> String getValue (T param);
}


public class NbFileLineInformationElement implements InformationElement{
    @Override
    public <File> String getValue(File param) {
          return *same code as in getLineNumber(myFile)*;
    }
}

public class UserInformationElement implements InformationElement{
      @Override
      public <UserRepository> String getValue(UserRepository param) {
         return *same code as in getUsersName(myDBRepository)*;
   }
}
  1. Здесь мой универсальный тип не работает: файл не преобразован в java.io.File (то же самое для моего репозитория jpa). Что я здесь делаю не так?
  2. Это лучшая практика для моих нужд?
4 голоса | спросил Tyvain 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2018 03:37:11 +0300 2018, 03:37:11

1 ответ


0
Вы определили параметры типа ---- +: = 0 =: + ---- и ---- +: = 1 =: + ---- , которые скрывают имена классов ---- +: =2 =: + ---- и ---- +: = 3 =: + ---- .Это один из сюрпризов именования параметров типа, аналогичных существующим классам.Параметры типа не представляют классы, и у них нет границ, поэтому компилятор может только предполагать, что они имеют методы ---- +: = 4 =: + ---- .Это не лучшая практика.При реализации универсальных методов методы должны оставаться универсальными и, по крайней мере, настолько широко открытыми в отношении границ.Чтобы иметь возможность ограничить значение параметра типа позже, определите его в классе /интерфейсе и позвольте подклассам предоставлять то, что он должен означать для этой конкретной реализации, с аргументом типа.Лучшее решение здесь - переместить параметр типа ---- +: = 5 =: + ---- в класс и предоставить аргументы типа в ваших подклассах.Методы больше не являются общими, но они используют параметры типа, определенные в интерфейсе /классах.
ответил rgettman 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2018 03:47:15 +0300 2018, 03:47:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132