0

パラメティック型 (リスト) を動的にバインドする必要がありますが、うまくいきません... これが私のクラスの概要です:

public abstract interface SettingsField<A> extends Window

次に、SettingsField を実装するいくつかのクラスがあります。

public class StringSettingsField implements SettingsField<String>
public class MapSettingsField<K, V> implements SettingsField<Map<K, V>>

1 つ目は非常に単純ですが、たとえば 2 つ目は少しトリッキーです...だから、SettingsFileds を返すファクトリを作成したいと考えています。動的バインディングを使用して、そこに入れたいオブジェクトごとに適切な SettingsWindow を取得したいと考えています。だから私は getField メソッドを次のようにオーバーロードします。文字列の場合は非常に簡単です:

public SettingsField<String> getField(String x){
    return new StringSettingsField();
}

しかし、マップには問題があります...

public SettingsField<Map<? extends String, ?>> getField(Map<? extends String, ?> x){
    return new MapSettingsField();
}

キーは常に文字列であるということは例です(?も可能性があります)が、コンパイラは私に警告を与えます

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

しかし、どうすればここでこれを行うことができますか? 問題は、java の f-generic に問題があるため、Map の使用が無効であることです (B が A のサブタイプであっても、List は List の暗黙的なサブタイプではありません)。

ヒントはありますか?前もって感謝します!

4

1 に答える 1

1

IIUYC、あなたが必要です

return new MapSettingsField<? extends String, ?>();

ところで、extends StringString は final であるため、あまり意味がありません。

しかし、私は次のようなものに行きます

public <K, V> SettingsField<Map<K, V>> getField(Map<K, V> x){
    return new MapSettingsField<K, V>();
}

K を有界と宣言することもできます。

public <K extends Number, V extends List> ...

または何でも。

于 2011-02-02T13:42:08.310 に答える