我可以使用变量类型在Java中声明另一个变量吗?

时间:2014-07-30 04:38:43

标签: java generics types map

我可以在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;

因为有一段时间,如果地图级别太深或太复杂,则很难写入和读取。

2 个答案:

答案 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的任何其他实现,同时保持代码简短。