有没有办法为Collection定义类型?
如果我有以下内容:
private Map<String, A> myMap;
然后有一种方法可以将Map<String, A>
定义为新类型MapOfTypeA,例如,这样我就可以将myMap定义为
private MapOfTypeA myMap;
作为此的延伸,是否有办法实现以下目标:
myMap = new MapOfTypeA();
实际上是
myMap = new HashMap<String, A>();
我不确定我要问的是什么,但我想我已经解释过了。在C或C ++中,我认为它将是一个typedef。
答案 0 :(得分:3)
您可以将MapOfTypeA定义为
class MapOfTypeA extends HashMap<String, A> {
}
但不确定目的是什么。如果您关注的是详细程度,那么Java 7已经引入了钻石运算符,您可以使用它来声明您的地图,如下所示:
Map<String, A> myMap = new HashMap<> ();
而不是
Map<String, A> myMap = new HashMap<String, A> ();
答案 1 :(得分:1)
这样的东西?
class MapOfTypeA extends HashMap<String, A> { }
这使得以下声明完全有效:
private MapOfTypeA myMap;
您需要的那种类声明才能实现您正在寻找的缩写语法。当然,关于你为什么这样做的评论将比定义本身长一个数量级。 ; - )
答案 2 :(得分:1)
是你的意思吗?
public class MapOfTypeA extends HashMap<String, A>{}
然后,您可以在任何需要HasMap的地方使用MapOfTypeA实例。
...但我真的不知道这会有用(?)
答案 3 :(得分:1)
Java中没有typedefs
或aliases
。你可以得到的最接近的是创建一个新类型,这几乎是相同的但不完全相同:
class MapOfA extends <String, A> {}
MapOfA aMap = new MapOfA();
我发现这个有用的唯一地方是(某种)部分专业化:
class MapFromString<X> extends Map<String, X> {}
答案 4 :(得分: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));
}
}
答案 5 :(得分:0)
在Java术语中,它称为泛型:http://en.wikipedia.org/wiki/Generics_in_Java
你定义它的方式是完全正确的。
但您可能需要恢复定义hashmap的方式。
如果希望hashmap同时具有A和MapOfTypeA,并且MapOfTypeA是A的子类
class MapOfTypeA extends A
,那么你的hashmap应该这样定义。
HashMap<String, MapOfTypeA> myMap;