16

ライブラリで定義されている、変更できないクラスを拡張しています。

public class Parent
{
    public void init(Map properties) { ... }
}

Parentを拡張するクラス'Child'を定義していて、ジェネリックスでJava 6を使用している場合、チェックされていない警告を受け取らずにinitメソッドをオーバーライドする最良の方法は何ですか?

public class Child extends Parent
{
    // warning: Map is a raw type. References to generic type Map<K,V> should be parameterized
    public void init(Map properties) { }
}

汎用パラメーターを追加すると、次のようになります。

   // error: The method init(Map<Object,Object>) of type Child has the same erasure as init(Map) of type Parent but does not override it
   public void init(Map<Object,Object>) { ... }
   // same error
   public void init(Map<? extends Object,? extends Object>) { ... }
   // same error
   public void init(Map<?,?>) { ... }

このエラーは、特定のタイプ、制限付きワイルドカード、または制限なしワイルドカードのいずれを使用しているかに関係なく発生します。警告なしで、@ SuppressWarnings( "unchecked")を使用せずに、非ジェネリックメソッドをオーバーライドする正しいまたは慣用的な方法はありますか?

4

4 に答える 4

13

はい、ジェネリックス情報を追加せずに、親クラスと同じシグネチャでオーバーライドメソッドを宣言する必要があります。

最善の策は@SuppressWarnings("unchecked")、メソッドではなくraw-typeパラメーターにアノテーションを追加することです。そうすれば、独自のコードにある可能性のある他のジェネリックスの警告をスケルチすることはありません。

于 2008-10-28T01:09:43.867 に答える
3

簡単な答え:それを行う方法はありません。

満足できない答え:IDE / build.xmlの(特定の)警告を無効にします。

ライブラリを変更できない場合は、残念ながら、一般的でないメソッドを使用する必要があります。

問題は、型消去後、両方のinit()が同じシグネチャを持っているにもかかわらず、実際には異なるメソッド、または同じ(*)である可能性があることです。コンパイラは、オーバーライドまたはオーバーロードのどちらを実行するかを判断できないため、禁止されています。

(*)ライブラリ開発者がinit(Map <String、Integer>)を意味するとします。これで、init(Map <String、String>)を実装しています。これはオーバーロードであり、Childクラスのvtableに2つのメソッドが存在する必要があります。

しかし、ライブラリ開発者がinit(Map <String、String>)を意味する場合はどうでしょうか。次に、それはオーバーライドされ、メソッドはChildクラスの元のinitを置き換える必要があり、Childのvtableにはメソッドが1つだけ存在します。

PS私はジェネリックスがJavaでどのように実装されているのか嫌いです:-(

于 2008-10-28T01:05:22.937 に答える
2

上記の回答は、代わりに @SuppressWarnings("rawtypes") と言う意味だと思います。

于 2011-04-28T17:33:14.540 に答える
0

親と同じ署名でメソッドを宣言する必要があるため、コンパイル時に警告が表示されます。@SuppressWarnings("unchecked") でそれらを抑制することができます

これを取り除く方法がないのは、無効なタイプのコレクションを作成できることを知らせる警告があるからです。警告は、それを許可する可能性のあるすべてのコードが削除された場合にのみ消えます。非ジェネリック クラスから継承しているため、無効な内容のコレクションを作成することが常に可能です。

于 2008-10-28T17:57:41.960 に答える