0

このようにメソッドを書くと。次の警告が表示されます。

BaseEvent は raw タイプです。ジェネリック型 BaseEvent への参照はパラメーター化する必要があります

@Override
public <T extends BaseEvent> void actionPerformed(T event) { ... }

警告サインが煩わしいですが、コードは問題なく動作します。このようにコードを書くと、警告は消えます。

@Override
public <T> void actionPerformed(BaseEvent<T> event) { ... }

前のメッセージでは、それが BaseEvent のサブクラスであることを保証しません。だから私はそれを再び変更しました:

@Override
public <T extends EventObject> void actionPerformed(BaseEvent<T> event) { ... }


@Override
public <T extends BaseEvent<T>> void actionPerformed(BaseEvent<T> event) { ... }

BaseEvent クラスは、EventOBject を拡張して作成したクラスです。

public abstract class BaseEvent<T> extends EventObject
{
    private String eventType;

    // Constructor
    public BaseEvent(Object source, String type) 
    {
        super(source);
        eventType = type;
    }


    public String getEventType()    { return eventType; }   
}

すべての方法はうまくいくようです。しかし、私はどちらがより良い解決策であるか疑問に思っていました。

4

3 に答える 3

2

定義のどこで使用TBaseEventますか? 以下のように定義します

public abstract class BaseEvent extends EventObject

その後、警告は表示されません

@Override
public void actionPerformed(BaseEvent event) { ... }

アップデート

BaseEvent本当にパラメータ化する必要があるとします。次に、次のように記述します

@Override
public <T> void actionPerformed(BaseEvent<T> event) { ... }

これにより、パラメータ化されたメソッドが得られます。

更新 1

It doesn't guarantee that is a subClass of BaseEvent.

します。<T>メソッド テンプレートのパラメーターです。このパラメーターは、定義BaseEvent<T>によりのサブクラスに移動EventObjectします。

更新 2

学習の開始時にジェネリックを使用しないでください。ジェネリックは、追加の自己テスト用です。生の型を使用します。次に、それらを感じ始めると、それらを正しくパラメーター化します。

于 2012-12-06T21:09:49.253 に答える
1

最良の解決策は、警告を回避し、コンパイル時に型の安全性を保証するものです。

BaseEvent の T の型が重要でない場合は、最初のものを使用して BaseEvent をパラメーター化できませんか? 次のようにします。

@Override
public <T extends BaseEvent<?>> void actionPerformed(T event) { ... }

BaseEventまたは、クラスが実際にTは何も使用していないように見えます-なぜそこにあるのですか?

于 2012-12-06T21:04:37.023 に答える
1

型パラメーター T は、クラス定義では使用されません。から型パラメーターを削除できる場合がありますBaseEvent

public abstract class BaseEvent extends EventObject { ... }

型パラメーターなしでメソッドを定義するだけです。

@Override
public void actionPerformed(BaseEvent event) { ... }
于 2012-12-06T21:05:54.317 に答える