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 ?
请解释我为何以及如何解决这个问题。
答案 0 :(得分:4)
eventsMap
声明中有一个通配符:
private static Map<String, List<?>> eventsMap = new HashMap<>();
这意味着在地图中存储为值的List
可以是任何内容的列表。但这并不意味着任何东西都可以存储在其中。它是特定但未知类型的列表。它可以是List<Object>
,List<Integer>
或List<Foo>
。出于类型安全原因,编译器必须禁止对add
进行此类调用,因为它无法判断event
的类型是否正确。
由于event
似乎是Class
,请将通配符替换为Class<?>
:
private static Map<String, List<Class<?>>> eventsMap = new HashMap<>();
这样,可以将表示任何类的Class
对象插入从地图中检索到的列表中。