2012-02-14 3 views
2

Есть ли способ определить тип коллекции?Определение типа для коллекции Java

Если у меня есть следующие:

private Map<String, A> myMap; 

то есть способ определить Map<String, A> в качестве нового типа MapOfTypeA, например, так, что я могу определить MyMap, как

private MapOfTypeA myMap; 

как это может быть следующим образом:

myMap = new MapOfTypeA(); 

Фактически должно быть

myMap = new HashMap<String, A>(); 

Я не уверен, что назвать то, что я прошу, но я думаю, что объяснил это. Я думаю, что на C или C++ это будет typedef.

ответ

3

Вы можете определить MapOfTypeA, как

class MapOfTypeA extends HashMap<String, A> { 
} 

Но не уверен, что цель. Если ваша проблема является многословие, то Java 7 уже ввел оператор бриллиантом, который вы можете использовать, чтобы объявить свою карту, как это:

Map<String, A> myMap = new HashMap<>(); 

вместо

Map<String, A> myMap = new HashMap<String, A>(); 
+0

+ 1 для подсказки для Java 7 – alex

1

Что-то вроде этого?

class MapOfTypeA extends HashMap<String, A> { } 

Что делает следующее заявление совершенно правильное:

private MapOfTypeA myMap; 

Такого рода объявление класса есть все, что нужно для достижения сокращенного синтаксиса, который вы ищете. Конечно, комментариев о том, почему вы делаете это, будет на порядок больше, чем само определение. ;-)

+0

Вы не можете расширить интерфейс карты :-) – assylias

+0

@assylias: Хорошая уловка. Исправлена. –

1

это то, что вы имеете в виду?

public class MapOfTypeA extends HashMap<String, A>{} 

Тогда вы можете использовать экземпляры MapOfTypeA, где бы вам не понадобился HasMap.

... но я не могу видеть, где это было бы полезно (?)

+0

Причина этого заключается в разъяснении и читаемости. Если у вас есть как Map , так и Map , тогда UrlTypeMap и UserTypeMap легче обнаружить в коде, и с меньшей вероятностью могут быть ошибочно приняты с помощью завершения кода (так как разница ближе к Начало). Если во многих местах одного и того же файла используются 2, 3 или 4 разных типа карты, это может сделать более понятным использование классов с псевдонимом. – Xetius

1

Там нет typedefs или aliases в Java. Ближайший вы можете получить, чтобы создать новый тип, который почти то же самое, но не совсем:

class MapOfA extends <String, A> {} 
MapOfA aMap = new MapOfA(); 

Единственное место, которое я нашел, что это полезно для (вид) частичной специализации:

class MapFromString<X> extends Map<String, X> {} 
0

В Java Условия, это Дженерики вызов: http://en.wikipedia.org/wiki/Generics_in_Java

И как вы определили, что это совершенно правильно.

, но вам, вероятно, нужно вернуться, как вы определяете свой хэш.

Если вы хотите, чтобы hashmap имел как A, так и MapOfTypeA, а MapOfTypeA является подклассом A class MapOfTypeA extends A, тогда ваш хэш должен быть определен таким образом.

HashMap<String, MapOfTypeA> myMap; 
1

я могу думать, по крайней мере, два варианта

1) сохранить объект значения родовое, ключи всегда один тип

public class StringKeyedMap<V> extends ConcurrentHashMap<String,V> { 

    public static void main(String[] args) { 
    StringKeyedMap<Integer> stringToIntegerMap = new StringKeyedMap<Integer>(); 
    stringToIntegerMap.put("some-key", Integer.valueOf(7)); 
    } 
} 
ключ

2) и значение карты всегда представляют собой один тип

public class MyMap extends ConcurrentHashMap<String,Integer> { 

    public static void main(String[] args) { 
    MyMap myMap = new MyMap(); 
    myMap.put("some-key", Integer.valueOf(7)); 
    } 
} 
Смежные вопросы