gpt4 book ai didi

java - 这会导致可变参数造成堆污染吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:17:30 25 4
gpt4 key购买 nike

我收到警告:

[unchecked] Possible heap pollution from parameterized vararg type Class

但我不确定它是否真的会污染:

public void register(EventListener listener, Class<? extends Event>... eventTypes) {}

如果有必要,这里是完整的实现:

public class EventDispatcher {

public static ConcurrentLinkedQueue<Event> eventQueue;
public static ConcurrentHashMap<Class<? extends Event>, CopyOnWriteArrayList<EventListener>> eventsListenerMap =
new ConcurrentHashMap<>();

public static void register(EventListener listener, Class<? extends Event>... eventTypes) {
for (Class<? extends Event> eventType : eventTypes) {
if (eventsListenerMap.containsKey(eventType)) {
eventsListenerMap.get(eventType).addIfAbsent(listener);
} else {
CopyOnWriteArrayList<EventListener> initializingListeners =
new CopyOnWriteArrayList<>();
initializingListeners.add(listener);
eventsListenerMap.put(eventType, initializingListeners);
}
}
}
}

我也非常愿意接受 OT 的改进建议,但请记住,这门课还没有完成。

最佳答案

有关通用可变参数的警告与 dangers of generic arrays 有关.从理论上讲,该方法可能会滥用数组与传入数组的协方差,从而导致堆污染,例如:

Class<?>[] eventTypesWithWidenedType = eventTypes;
eventTypesWithWidenedType[0] = String.class;
Class<? extends Event> eventType = eventTypes[0]; // liar!

但只要方法实现不做任何愚蠢的事情就可以了。一些基本的预防措施是:

  • 不要对 eventTypes 进行任何赋值。
  • 不要在方法外返回或以其他方式公开 eventTypes

在 Java 7 中,您可以使用 @SafeVarargs 注释该方法,它基本上向编译器 promise 泛型数组是可以的(这意味着它不再由调用者来抑制警告)。

关于java - 这会导致可变参数造成堆污染吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com