【问题标题】:Java Generics and FunctionsJava 泛型和函数
【发布时间】:2020-12-08 21:30:26
【问题描述】:

我有一个函数

public static void printTreeMap (TreeMap <Object, ArrayList> map, PrintStream ps)

还有一个 TreeMap:

TreeMap <Integer, ArrayList<MyClass>> tm = new TreeMap<>();

当我尝试像这样调用printTreeMap 时:printTreeMap(tm, System.out);,我得到一个异常

task_v7 类型中的方法printTreeMap(TreeMap&lt;Object,ArrayList&gt;, PrintStream) 不适用于参数(TreeMap&lt;Integer,ArrayList&lt;MyClass&gt;&gt;, PrintStream) Java(67108979)

我该如何解决?

【问题讨论】:

  • TreeMap &lt;Integer, ArrayList&lt;MyClass&gt;&gt; 不是 TreeMap&lt;Object, ArrayList&gt; 的子类型。后者允许map.put("Foo", List.of("Foo", "Bar")),前者不允许。这些类型不兼容。
  • @Polygnome 那么我应该如何定义printTreeMap

标签: java function object generics treemap


【解决方案1】:

我会建议这种方法。请注意,对于这种类型的一般方法,没有这些类型的先验知识。因此,这仅依赖于覆盖 toString() 所涉及的类型。

public static <T,U> void printTreeMap(TreeMap<T,  ArrayList<U>> tm, PrintStream st) {
     tm.forEach((k,v)-> {
          st.println(k);
          for (U e : v) {
              st.println("  " + e);
          }
     });
}

请注意,T 和 U 不必不同,因为两者可以是相同的类型。

这是一个例子。

TreeMap<Integer, ArrayList<MyClass>> tm = new TreeMap<>();
tm.put(10, new ArrayList<>(
        List.of(new MyClass("Alpha"), new MyClass("Beta"))));
tm.put(30, new ArrayList<>(
        List.of(new MyClass("Gamma"), new MyClass("Delta"))));

printTreeMap(tm, System.out);

打印

10
  Alpha
  Beta
30
  Gamma
  Delta

班级

class MyClass {
    String a;
    
    public MyClass(String a) {
        this.a = a;
    }
    
    public String toString() {
        return a;
    }
}

对于任何列表映射,一种更通用的方法如下:

public static <L extends List<?>, M extends Map<?,L>> void printMapOfLists(M tm,
        PrintStream st) {
    tm.forEach((k, v) -> {
        st.println(k);
        for (Object e : v) {
            st.println("  " + e);
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多