2

ハッシュマップの操作に問題があります。私の問題は非常に単純ですが、うまくいきません...

という名前のインターフェースがありますMultilineWritable。フラット ファイルでマーシャリングする必要がある私のクラスは、String toFlatFormat()関数とその反対を定義するこのインターフェイスを実装しますinit(String flatFormat)

Contractクラスが実装MultilineWritableし、整数によって識別される一方で、Personクラスもこのインターフェースを実装しますが、文字列によって識別されると想像してください。

コントラクトと人物の HashMaps をマーシャリングする私の関数は次のようになります。

public void marshall(HashMap<Object, MultilineWritable>){}

私の問題は、 extendsとextendsであっても、 aHashMap<String, Person>を aにキャストする方法が見つからないことです。...のキャストについても同じです。その結果、ジェネリック関数を呼び出すことができません。HashMap<Object, MultilineWritable>StringObjectPersonMultilineWritableHashMap<Integer, Contract>

この問題に関するヘルプについては、Thx.

4

3 に答える 3

8

marshallメソッドが値のみを読み取ると仮定すると、宣言を次のように変更する必要があります。

public void marshall(HashMap<?, ? extends MultilineWritable> map)

問題は、既存のメソッド呼び出しが許可されている場合、間違ったマップタイプであっても、マップに何か を入れようとする可能性があることです。MultilineWritable

Map<String, Person> map = new HashMap<String, Person>();

// What would you want map.put("foo", new Contact()) to do inside marshall?
marshall(map);

編集:ワイルドカードの詳細については、JavaGenericsFAQを参照してください。

于 2012-08-14T13:15:39.557 に答える
0

Javaでは、ジェネリックは共変ではありません。だからあなたはフォローすることはできません

    List<Integer> numList = new ArrayList<Integer>();
    List<Number> numList = new ArrayList<Number>();
    numList = numList; //Error
    numList = (List<Number>)intList; //error

ジェネリックスは、コンパイラーがtypsafetyに使用します。(コレクションの、つまりこれは整数のリストである)実際の型情報などは実行時に失われます。

于 2012-08-14T13:32:44.453 に答える
0

あなたがやろうとしているのは、 aspecific typeに aを渡すことgeneric typeです。Javaの機能を使用する必要がありgenericsます。ジェネリックは を提供するcompile time safety onlyため、特定の型を遺伝子型を取る関数に渡すことはできますが、コレクションまたはマップを変更することはできません。

つまり、あなたのアンサーは次のとおりです。

public void marshall(HashMap<? extends Object, ? extends MultilineWritable> map)
于 2012-08-14T13:25:04.480 に答える