Java 泛型和函数

Java Generics and Functions

我有一个功能

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

和一个 TreeMap:

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

当我尝试像这样调用 printTreeMap 时:printTreeMap(tm, System.out);,出现异常

The method printTreeMap(TreeMap<Object,ArrayList>, PrintStream) in the type task_v7 is not applicable for the arguments (TreeMap<Integer,ArrayList<MyClass>>, PrintStream) Java(67108979)

我该如何解决?

我建议采用这种方法。请注意,对于这种类型的一般方法,没有这些类型的先验知识。因此,这完全依赖于覆盖 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

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