Дженерики в Java

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

Typedef myGenDef = < Object1, Object2 >;

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

for (Entry< myGenDef > ent : hm..entrySet())
{
.
.
.
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
10
0
2 327
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

def map = new HashMap<complicated generic expression>();

То же и со Scala. Эти языки предлагают синтаксис, который может выводить типы из операторов создания экземпляров переменных. Это похоже на то, что предлагается в .NET с ключевым словом var. Не путайте это со слабо (или слабо) типизированными языками, которые позволяют вам выбирать тип переменной на лету; JVM по-прежнему обеспечивает строгую типизацию в своем скомпилированном коде.

Jesse Webb 19.07.2011 22:52
Ответ принят как подходящий

Вот антипаттерн псевдо-typedef ...

class StringList extends ArrayList<String> { }

Хорошая штука, выпей! ;-)

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

Возможно, не стоит принимать антипаттерн как решение вашего вопроса, особенно когда есть альтернативы. Но если это помогло вам с вашей конкретной проблемой ...

Jesse Webb 19.07.2011 22:54

(Не обращая внимания на предостережение модераторов по поводу шума в потоках "typedef in Java") ... Это хуже, чем антипаттерн. Он создает новый первоклассный тип с собственными записями в таблицах виртуальных методов и всеми подобными обязательствами. Определение типа C++ просто сделало бы часть «ArrayList <String>» СУХОЙ, так что вы можете изменить String (или ArrayList) только в одном месте.

Phlip 20.09.2013 21:22

Да, определения типов C / C++ - это хорошо зарекомендовавшая себя языковая функция с хорошей поддержкой и множеством законных применений. Это не. Отсюда и все "антипаттерны".

Shog9 20.09.2013 21:24

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

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

    <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>();
}

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

Другие вопросы по теме