Есть ли какой-либо сокращенный способ определения и использования общих определений без необходимости повторять конкретное общее описание, так что если есть изменение, мне не нужно менять все определения / использования, хотя кодовая база, например, может быть примерно такой:
Typedef myGenDef = < Object1, Object2 >;
HashMap< myGenDef > hm = new HashMap< myGenDef >();
for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}




Нет. Хотя groovy, язык JVM, имеет динамическую типизацию и позволяет писать:
def map = new HashMap<complicated generic expression>();
Вот антипаттерн псевдо-typedef ...
class StringList extends ArrayList<String> { }
Хорошая штука, выпей! ;-)
Как отмечается в статье, у этого метода есть некоторые серьезные проблемы, в первую очередь из-за того, что этот «typedef» на самом деле является отдельным классом и, следовательно, не может использоваться взаимозаменяемо ни с типом, который он расширяет, ни с другими подобными определенными типами.
Возможно, не стоит принимать антипаттерн как решение вашего вопроса, особенно когда есть альтернативы. Но если это помогло вам с вашей конкретной проблемой ...
(Не обращая внимания на предостережение модераторов по поводу шума в потоках "typedef in Java") ... Это хуже, чем антипаттерн. Он создает новый первоклассный тип с собственными записями в таблицах виртуальных методов и всеми подобными обязательствами. Определение типа C++ просто сделало бы часть «ArrayList <String>» СУХОЙ, так что вы можете изменить String (или ArrayList) только в одном месте.
Да, определения типов C / C++ - это хорошо зарекомендовавшая себя языковая функция с хорошей поддержкой и множеством законных применений. Это не. Отсюда и все "антипаттерны".
В универсальном методе вы можете использовать ограниченную форму определения типа, чтобы избежать некоторых повторений.
Пример: если у вас есть функция
<K, V> Map<K, V> getSomething() {
//...
}
вы можете использовать:
final Map<String, Object> something = getsomething();
вместо:
final Map<String, Object> something = this.<String, Object>getsomething();
Используйте Заводской образец для создания Generics:
Пример метода:
public Map<String, Integer> createGenMap(){
return new HashMap<String,Integer>();
}
Антипаттерн pseudo-typedef, упомянутый Shog9, будет работать - хотя не рекомендуется использовать ANTIPATTERN - но он не отвечает вашим намерениям. Цель pseudo-typedef - уменьшить беспорядок в объявлении и улучшить читаемость.
Вы хотите иметь возможность заменить группу деклараций дженериков одной сделкой. Я думаю, вы должны остановиться и подумать: «В чем же дело, это ценно?». Я имею ввиду, я не могу придумать сценарий, в котором вам это понадобится. Представьте себе класс A:
class A {
private Map<String, Integer> values = new HashMap<String, Integer>();
}
Теперь представьте, что я хочу заменить поле «значения» на карту. Почему может существовать множество других полей, разбросанных по коду, требующих такого же изменения? Что касается операций, в которых используются «значения», достаточно простого рефакторинга.
То же и со Scala. Эти языки предлагают синтаксис, который может выводить типы из операторов создания экземпляров переменных. Это похоже на то, что предлагается в .NET с ключевым словом var. Не путайте это со слабо (или слабо) типизированными языками, которые позволяют вам выбирать тип переменной на лету; JVM по-прежнему обеспечивает строгую типизацию в своем скомпилированном коде.