我可以在Java中做这样的事情吗?
HashMap<String, Child> childMap=new HashMap<String, Child>();
HashMap<String, childMap.typeName> parentMap=new HashMap<String, childMap.typeName>();
//instead of
HashMap<String, HashMap<String, Child>> parentMap=new HashMap<String, HashMap<String, Child>>();
或类似的东西
HashMap<String, HashMap<String, Child>> parent1=new HashMap<String, HashMap<String, Child>>();
parent1.typeName parent2=new parent1.typeName;
因为有一段时间,如果地图级别太深或太复杂,则很难写入和读取。
答案 0 :(得分:4)
通过定义子类可以缩写:
class Str2Child extends HashMap<String, Child>>{}
class Str2Map extends HashMap<String,Str2Child>{}
Str2Map parent1 = new Str2Map();
答案 1 :(得分:2)
不,但如果您使用的是Java 7或更高版本,则可以缩短它。编译器可以从作业的左侧推断出类型参数,您可以在创建对象时完全跳过它们HashMap<String, HashMap<String, Child>> parentMap = new HashMap<>();
在旧版本的Java中,您可以使用Guava's Maps class and its newHashMap
方法。 HashMap<String, HashMap<String, Child>> parentMap = Maps.newHashMap();
您可能要做的另一件事是创建一个实现通用HashMap
的特定规范的类型。
public class HashMapStringChild extends HashMap<String, Child> {
}
然后将其用作类型参数
HashMap<String, HashMapStringChild> parent2 = new HashMap<>();
但就个人而言,我觉得这有点紧张。我当然不会过度使用它,我会小心扩展集合类。
您还应该注意,您有效地将API绑定到Map
接口(HashMap
)的特定实现,或者更糟糕的是,在引入新类的情况下({} {1}}),针对特定的非标准实施。
如果在某些时候,您决定始终对HashMapStringChild
个对象进行排序,该怎么办?你可以通过切换到Child
来做到这一点,但这意味着需要进行大量的重构。
最好将API基于更通用的界面。这样你可以从
切换TreeMap
到
Map<String, Map<String, Child>> map = new HashMap<String, HashMap<String, Child>>();
或
Map<String, Map<String, Child>> map = new HashMap<String, TreeMap<String, Child>>();
或任何其他没有麻烦的实施。
如果您确实要将Map<String, Map<String, Child>> map = new TreeMap<String, TreeMap<String, Child>>();
到String
的地图设为特定类型,可以引入界面
Child
然后,您可以保持引用类型的一般性,并使用public interface MapStringToChild extends Map<String, Child> {
}
,HashMap<String, Child>
,TreeMap<String, Child>
或字面上将HashMapStringChild
映射到String
的任何其他实现,同时保持代码简短。