【问题标题】:Can I use type of a variable to declare another variable in Java?我可以使用变量的类型在 Java 中声明另一个变量吗?
【发布时间】:2014-07-30 04:38:43
【问题描述】:

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

因为有些时候,如果地图层级太深或太复杂,很难写和读。

【问题讨论】:

  • 简而言之:不,你不能! :) 其次,您选择的标题具有误导性,因为您没有“使用变量来定义另一个”,而是尝试使用“变量的类型......”
  • 否,但如果您使用的是 Java 7 或更高版本,则可以缩短它。编译器可以从赋值左侧推断类型参数,您可以在创建对象时完全跳过它们 HashMap&lt;String, HashMap&lt;String, Child&gt;&gt; parentMap = new HashMap&lt;&gt;(); 在旧版本的 Java 中,您可以使用 Guava's Maps class 及其 newHashMap 方法。 HashMap&lt;String, HashMap&lt;String, Child&gt;&gt; parentMap = Maps.newHashMap();
  • 所以...一旦您意识到您将地图嵌套在地图中的地图中的地图中的地图中的地图中,您应该真正重新考虑您的数据结构并查看如果你仍然认为合适的话。

标签: java generics types map


【解决方案1】:

可以通过定义子类来缩写:

class Str2Child extends HashMap<String, Child>>{}
class Str2Map extends HashMap<String,Str2Child>{}

Str2Map parent1 = new Str2Map();

【讨论】:

    【解决方案2】:

    不,但如果您使用的是 Java 7 或更高版本,则可以缩短它。编译器可以从赋值左侧推断类型参数,您可以在创建对象时完全跳过它们HashMap&lt;String, HashMap&lt;String, Child&gt;&gt; parentMap = new HashMap&lt;&gt;();

    在旧版本的 Java 中,您可以使用 Guava's Maps class and its newHashMap 方法。 HashMap&lt;String, HashMap&lt;String, Child&gt;&gt; parentMap = Maps.newHashMap();

    您可以做的另一件事是创建一个实现泛型HashMap 的特定规范的类型。

    public class HashMapStringChild extends HashMap<String, Child> {
    }
    

    然后将其用作类型参数

    HashMap<String, HashMapStringChild> parent2 = new HashMap<>();
    

    但就个人而言,我觉得这有点牵强。我当然不会过度使用它,而且我会小心扩展集合类。

    附录

    您还应该注意,您正在有效地将 API 绑定到 Map 接口 (HashMap) 的特定实现,或者更糟糕的是,如果引入新类 (HashMapStringChild) 到特定的、非标准的实现。

    如果在某个时候,您决定始终对您的 Child 对象进行排序怎么办?你可以通过切换到TreeMap 来做到这一点,但这意味着大量的重构。

    您最好将 API 建立在更通用的界面上。这样你就可以从

    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>>();
    

    或任何其他没有麻烦的实现。

    如果你真的想让StringChild的映射成为一个特定的类型,你可以引入一个接口

    public interface MapStringToChild extends Map<String, Child> {
    }
    

    然后您可以保持您的引用类型通用,并使用HashMap&lt;String, Child&gt;TreeMap&lt;String, Child&gt;HashMapStringChild 或任何其他将String 可互换地映射到Child 的实现,同时保持代码简短。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多