java泛型和函数

ufj5ltwl  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(241)

我有一个函数

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

还有一个树状图:

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

当我打电话的时候 printTreeMap 就像这样: printTreeMap(tm, System.out); ,我得到一个例外
方法 printTreeMap(TreeMap<Object,ArrayList>, PrintStream) 在类型task中,v7不适用于参数 (TreeMap<Integer,ArrayList<MyClass>>, PrintStream) java (67108979)
我该怎么修?

egmofgnx

egmofgnx1#

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

任何列表Map的更通用方法如下:

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

相关问题