0

重複の可能性:
特定の関数に対する Java コンパイラの警告を抑制する方法

Map を使用して Strategy パターンを実装したいと考えています。ただし、ジェネリックとうまく連携する方法でこれを行う方法が見つかりません。機能を変更せずに、次のコードからコンパイル警告を削除することは可能ですか?

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 に答える