定义Java Collection的类型

时间:2012-02-14 18:11:53

标签: java

有没有办法为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。

6 个答案:

答案 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中没有typedefsaliases。你可以得到的最接近的是创建一个新类型,这几乎是相同的但不完全相同:

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;