Обобщения в Java - PullRequest
       16

Обобщения в Java

10 голосов
/ 01 сентября 2008

Существует ли какой-либо сокращенный способ определения и использования общих определений без необходимости повторять определенное общее описание, так что если есть изменение, мне не нужно изменять все определения / использования, хотя, например, кодовая база является чем-то вроде это возможно:

Typedef myGenDef = < Object1, Object2 >;

HashMap< myGenDef > hm = new HashMap< myGenDef >();

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}

Ответы [ 5 ]

11 голосов
/ 01 сентября 2008

Есть псевдотипный антипаттерн ...

class StringList extends ArrayList<String> { }

Хорошие вещи, выпей! ; -)

Как отмечается в статье, у этого метода есть некоторые серьезные проблемы, в первую очередь, из-за того, что этот "typedef" на самом деле является отдельным классом и поэтому не может использоваться взаимозаменяемо ни с типом, который он расширяет, ни с другими аналогично определенными типами.

4 голосов
/ 01 сентября 2008

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

Пример: если у вас есть функция

    <K, V> Map<K, V> getSomething() {
        //...
    }

Вы можете использовать:

final Map<String, Object> something = getsomething();

вместо:

final Map<String, Object> something = this.<String, Object>getsomething();
3 голосов
/ 01 сентября 2008

Используйте Фабричный шаблон для создания Общих:

Образец метода:

public Map<String, Integer> createGenMap(){
        return new HashMap<String,Integer>();

    }
2 голосов
/ 02 сентября 2008

Антипаттерн псевдо-typedef, упомянутый Shog9, будет работать - хотя не рекомендуется использовать ANTIPATTERN - но он не отвечает вашим намерениям. Цель псевдо-typedef - уменьшить беспорядок в объявлении и улучшить читаемость.

То, что вы хотите - это иметь возможность заменить группу объявлений дженериков одной сделкой. Я думаю, что вы должны остановиться и подумать: «Ведьмы это ценно?». Я имею в виду, я не могу придумать сценарий, где тебе это понадобится. Представьте себе класс А:

class A {
     private Map<String, Integer> values = new HashMap<String, Integer>();
}

Теперь представьте, что я хочу изменить поле «значения» на карту. Почему существует много других полей, разбросанных по коду, который нуждается в таком же изменении? Что касается операций, использующих «значения», то простого рефакторинга будет достаточно.

1 голос
/ 01 сентября 2008

Нет. Впрочем, groovy, язык JVM, динамически типизирован и позволяет писать:

def map = new HashMap<complicated generic expression>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...