Параметры универсального языка Java с базой универсального параметра - PullRequest
3 голосов
/ 26 марта 2010

Мне интересно, есть ли элегантное решение для этого в Java (помимо очевидного - объявления другой / явной функции. Вот код:

private static HashMap<String, Integer> nameStringIndexMap 
        = new HashMap<String, Integer>();
private static HashMap<Buffer, Integer> nameBufferIndexMap 
        = new HashMap<Buffer, Integer>();

// and a function
private static String newName(Object object, 
        HashMap<Object, Integer> nameIndexMap){
    ....
}

Проблема в том, что я не могу передать nameStringIndexMap или nameBufferIndexMap параметры в функцию. У меня нет идеи относительно более элегантного решения, кроме выполнения другой функции, которая явно хочет параметр HashMap или HashMap .

Мой вопрос: Можно ли это сделать в более элегантном решении / с использованием дженериков или чего-то подобного?

Спасибо,

Юлиан

Ответы [ 2 ]

4 голосов
/ 26 марта 2010

Вы также можете сделать свою функцию общей:

private static <E extends Object> String newName(E object, 
        HashMap<E, Integer> nameIndexMap){
    ....
}

Это связывает два параметра функции вместе, поэтому для HashMap<String, Integer> вы можете передать только String экземпляров в качестве первого параметра. Это может или не может быть тем, что вы хотите: если вы хотите получить только элементы с карты, решение Джона проще, но если вы хотите добавить этот объект на карту, это единственный выбор.

3 голосов
/ 26 марта 2010

Вы хотите что-то вроде этого:

private static String newName(Object object, 
        HashMap<? extends Object, Integer> nameIndexMap) {
    ....
}

или (как указано в комментариях)

private static String newName(Object object, 
        HashMap<?, Integer> nameIndexMap) {
    ....
}

Это помешает вам поместить что-либо в карту, потому что вы не можете гарантировать, что получите правильный ключ - но вы можете получить вещи из карты и гарантировать, что они буду целыми числами.

Обратите внимание, что эта версия не делает метод универсальным - что означает, что он проще, но не обеспечивает такую ​​же безопасность типов, как версия Питера, поскольку вы не можете гарантировать, что object имеет правильный тип. У каждого подхода есть свои плюсы и минусы - используйте все, что наиболее уместно, исходя из основ метода. (Если вам нужно поместить запись в карту, подход Питера определенно лучше.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...