java - 使用通配符将项目添加到列表时出错

标签 java list generics compiler-errors wildcard

private static Map<String, List<?>> eventsMap = new HashMap<>();

public static void logEvent(String eventIdentifier, Class<?> event) {
    if (!eventsMap.containsKey(eventIdentifier)) {
        eventsMap.put(eventIdentifier, new ArrayList<>());
    }
    eventsMap.get(eventIdentifier).add(event);
}

我正在尝试制作一个可以选择记录事件的日志记录类。为此,我使用了一个将标识符链接到事件列表的 map 。我希望能够将任何类型的对象放入列表中,但是一旦确定了列表的类型,添加到列表中的所有下一个项目都必须符合第一种类型。例如:

    LogWriter.logEvent("date", "0:00:01");
    LogWriter.logEvent("date", "0:00:02");
    LogWriter.logEvent("date", "0:00:03");

    String[] a = {"street", "zipcode", "housenumber", "city"};
    String[] b = {"street", "zipcode", "housenumber", "city"};
    String[] c = {"street", "zipcode", "housenumber", "city"};

    LogWriter.logEvent("address", a);
    LogWriter.logEvent("address", b);
    LogWriter.logEvent("address", c);

但是我得到一个编译错误

eventsMap.get(eventIdentifier).add(event);

no suitable method found for add(Class<CAP#1>)
    method Collection.add(CAP#2) is not applicable
      (argument mismatch; Class<CAP#1> cannot be converted to CAP#2)
    method List.add(CAP#2) is not applicable
      (argument mismatch; Class<CAP#1> cannot be converted to CAP#2)
  where CAP#1,CAP#2 are fresh type-variables:
    CAP#1 extends Object from capture of ?
    CAP#2 extends Object from capture of ?

请解释为什么以及如何解决这个问题。

最佳答案

您在 eventsMap 的声明中有一个通配符:

private static Map<String, List<?>> eventsMap = new HashMap<>();

这意味着 List作为值存储在 map 中的 s 可以是任何内容的列表。但这并不意味着任何东西都可以存储在其中。它是一个特定但未知类型的列表。它可能是 List<Object> , 一个 List<Integer> , 或 List<Foo> .出于类型安全原因,编译器必须不允许这样调用 add ,因为它无法判断是否 event类型正确。

因为 event似乎是 Class , 将通配符替换为 Class<?> :

private static Map<String, List<Class<?>>> eventsMap = new HashMap<>();

这样一个Class表示任何类的对象都可以插入到从 map 中检索到的列表中。

关于java - 使用通配符将项目添加到列表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29636311/

相关文章:

java - 连接关闭,检测到 EOF

java - jasper 报告中同一页两侧的拆分表

C# 容器 - 矢量,。列表、队列、堆栈等

C# 泛型 - 奇怪的面试问题

Java I/O 对路径中的每个文件进行操作

java - 为什么 OffsetDateTime 不能在 Java 8 中解析 '2016-08-24T18:38:05.507+0000'

Java 将列表存储到数组

java - 将集合转换为列表而不创建新列表

java - 泛型,当扩展子类最终不需要知道类型时强制类型为 Void

C# 通用接口(interface)转换问题