2

Javaのジェネリックオブジェクトをジェネリックオブジェクトを拡張する型に適切にキャストする方法を理解するのに問題があります。

たとえば、次のような設定があるとします。

public class Parameters extends SomeCustomMap<String, String>
{
   ...
}

public class SomeCustomMap<K, V> implements Map<K, V>
{
    public SomeCustomMap<K, V> getSubSet(...)
    {
        SomeCustomMap<K, V> subset;

        ...

        return subset;
    }
}

class ExampleApp
{
    private void someMethod()
    {
        Parameters params;
        Parameters paramsSubSet;

        try
        {
            ...

            paramsSubSet = (Parameters) params.getSubSet(...);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

上記のようなコードを実行すると、一貫してClassCastExceptionがスローされますが、そのようなものは完全には理解していません。上記のようなシナリオを正しく設定する方法についてのアドバイスをいただければ幸いです。つまり、params.getSubSet(...)メソッドから返されるSomeCustomMapオブジェクトをParametersオブジェクトに適切にキャストするにはどうすればよいでしょうか。

前もって感謝します!

4

5 に答える 5

2

問題は、getSubSetによって返されるサブセットがインスタンスSomeCustomMapのインスタンスであり、Parametersのサブセットではないことです。

この問題はジェネリックを扱いません。ジェネリックを使用しなかった場合も同じ問題が発生します。

サブセットのインスタンスを作成する方法はわかりませんが、テンプレートの設計パターンといくつかのジェネリックを使用して問題を解決できる可能性があります。

于 2010-11-16T15:23:43.213 に答える
1

詳しい情報をお願いするコメントをしましたが、これまでの投稿内容を踏まえて、どこかに戻る(with )をgetSubSet構築している と思います。でオーバーライドしない場合、はではなく(基本クラス)を返すため、型キャストは失敗します。SomeCustomMapnew SomeCustomMapgetSubSetParametersParameters.getSubsetSomeCustomMapParametersParameters

(ホットヒント、クラスでオーバーライドgetSubSetする場合Parametersは、戻り型をに変更してParameters型キャストを回避できます。)

于 2010-11-16T15:22:16.970 に答える
1

ジェネリックスは本質的にキャストとは何の関係もありません(消去の性質上、キャスト中にジェネリックパラメーターをチェックできないことを除けば)。

この場合にを取得しClassCastExceptionている場合は、返されるオブジェクトが実際にはのインスタンスではないことを意味しますParameters。キャストする直前に、電話してみてください

System.out.println(params.getSubSet(...).getClass());

サブセットの実際の実行時クラスが何であるかを確認します。サブセットがParametersオブジェクトであるという期待は、実行時にほぼ確実に正しくないため、問題は他の場所にある可能性があります。これは、SomeCustomMapまたはそのサブクラスです。

于 2010-11-16T15:24:54.820 に答える
1

あなたはこのようなことを試すことができます:

public <T extends SomeCustomMap<K, V>> T getSubSet(...){
    T subset = (T)this.clone();
    subset.clear();

    return subset;
}

作成は少しおかしいように見えます-あなたが望むものにそれを自由に変更してください:)

ボーナスとして、キャストする必要はありません:)

paramsSubSet = params.getSubSet(...)
于 2010-11-16T15:40:04.263 に答える
0

他の人が説明しているように、問題は、構築している実際のオブジェクトがgetSubSet()のインスタンスではないということですParameters

考えられる回避策の1つを次に示します。私はそれが好きではありませんが、それはメソッドを宣言する方法ですSomeCustomMapが、その戻り値はどのサブクラスに対しても正しく入力されます。

public static <T extends SomeCustomMap<K, V>> getSubSet(T fullSet)
{
    T subset;

    ... (use fullSet instead of this)

    return subset;
}
于 2010-11-16T15:59:44.007 に答える