0

可能重复:
如何抑制特定函数的 Java 编译器警告

我想使用地图来实现策略模式。但是,我找不到一种可以很好地与泛型配合使用的方法。是否可以在不更改功能的情况下从以下代码中删除编译警告?

import java.util.HashMap;
import java.util.Map;

interface Event
{
}

interface EventProcessor<T extends Event>
{
    public void handleEvent(T event);
}


class EventA implements Event
{
}

class EventB implements Event
{
}

class ProcessorA implements EventProcessor<EventA>
{
    @Override
    public void handleEvent(final EventA event)
    {
        System.out.println("Handling event type A");
    }
}

class ProcessorB implements EventProcessor<EventB>
{
    @Override
    public void handleEvent(final EventB event)
    {
        System.out.println("Handling event type B");
    }
}

class GenericEventProcessor
{
    Map<Class<? extends Event>, EventProcessor> map = new HashMap<Class<? extends Event>, EventProcessor>();

    public GenericEventProcessor()
    {
        map.put(EventA.class, new ProcessorA());
        map.put(EventB.class, new ProcessorB());
    }

    public void processEvent(Event event)
    {
        EventProcessor eventProcessor = map.get(event.getClass());

        //Java Warning: GenericEventProcessorTest.java uses unchecked or unsafe operations.
        eventProcessor.handleEvent(event);
    }
}

public class GenericEventProcessorTest
{
    public static void main(String[] args)
    {
        EventA eventA = new EventA();
        EventB eventB = new EventB();

        GenericEventProcessor eventProcessor = new GenericEventProcessor();
        eventProcessor.processEvent(eventA);
        eventProcessor.processEvent(eventB);
    }
}

编辑:我应该说,不使用 SuppressWarnings!这通常告诉我我的设计有问题,我想知道这里是否是这种情况。

4

2 回答 2

3

目前在我看来,地图正在取代多态性,实际上对应于类型检查:

if (event instanceof EventA) {
}
else if (event instanceof EventB) {
}
// etc...

既然您使用事件的类型来确定相应的事件处理器,然后用事件调用它,为什么不使用访问者或双重调度模式:

event.getEventProcessor().processEvent(event);

这样每个事件都可以通过多态性了解与它对应的事件处理器。以上显然可以简单地折叠为:

event.process();

因此,它的复杂性要小得多,而且您不必为每种新事件类型填充地图。我注意到您正在实施策略模式,但这目前看起来很大程度上是静态的并且与每种类型相关。我希望策略模式可以在类型以外的东西上替换不同的实现例如,一些配置)

于 2012-12-14T14:02:08.060 回答
0

是的,添加

@SuppressWarnings("unchecked")

到方法。

问题是编译器无法确定操作是否安全。

于 2012-12-14T14:00:19.073 回答