3

変数を取得する私の関数の1つ。場合によってはそうなることもありますが、どうすればそれらを識別できますかjava.util.List<Test$MyClass>java.util.List<java.lang.String>

if (type instanceof List) {

}

どちらもリストタイプですが、タイプが異なります。そのため、上記のコードは機能しません。2つのリストタイプを区別したいと思います。

私の主な問題はhttps://stackoverflow.com/questions/15596112/implement-jsondeserializer-more-than-one-in-gson-in-androidです

私はそのために使用deserializerしています。

public class Data implements JsonDeserializer<ArrayList<MyClass1>> {
public ArrayList<MyClass1> myList1 = new ArrayList<MyClass1>();
public ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();

@Override
public ArrayList<MyClass1> deserialize(JsonElement json, Type type,
        JsonDeserializationContext context) throws JsonParseException {

    Debug.e("", type.toString());

    ArrayList<Layoutmap> data = new ArrayList<Layoutmap>();

    try {
        if (json.isJsonObject()) {

            // my stuff

            return data;
        } else {
            return new Gson().fromJson(json, type);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    return data;
}

}

上記のコードは機能しpublic ArrayList<MyClass2> myList2 = new ArrayList<MyClass2>();、逆シリアル化することもできます。これはgoogleGsonmyList2の一部です。

4

5 に答える 5

3

ええ、問題は、Javaでは、再利用できない型に対するインスタンステストが常にエラーになることです。

例えば:

if(o instance of List<E>)

ここで、Eは任意のタイプであり、コンパイルされません。

リストに含まれているものが同じタイプであることを確認する必要があります。

if(list1.get(0) instance of String && list2.get(0) instance of String)

編集:

ここに言語の壁の問題があるかどうかはわかりませんが(質問を完全に理解するのは難しいです)、メソッドにType型の引数をとらせる必要はありません。他の誰かが言ったように、あなたはここで悪いデザインを持っています。あなたがすべきことは、単に各クラスを逆シリアル化する方法を定義し(カスタム逆シリアル化を定義する必要がある場合...つまり、デフォルトが機能しない場合)、通常の方法でそれらのリストを取得することです。 gson。

私はGSONにあまり詳しくありませんが、次のようになります。

List<Class1> stuff = gson.fromJson(json, new TypeToken<List<Class1>>(){}.getType());

つまり、言い換えると、各クラスにデフォルトの逆シリアル化が機能しないという特性がある場合、逆シリアル化メソッドをすべてのタイプで機能させる方法はありません(クレイジーな体操なしでは)。また、すべての機能を1つにまとめないでください。ArrayList<LayoutMap>を取得することは、各クラスを逆シリアル化する機能から分離する必要があります。

于 2013-03-24T11:57:35.467 に答える
1

次のようなものを試すことができます:

for (int i=0; i<type.size(); ++i) {
    if (type.get(i) instanceof String) {
        // Do something here
    }
}

これにより、リストの各要素がチェックされ、それが文字列である場合は、リストで作業できます。

于 2013-03-24T12:00:51.700 に答える
1

実行時にオブジェクトのクラスを見つけるには、型でgetClass()関数を使用してみてください。たとえば、type.getClass()。equals(java.lang.string)

于 2013-03-24T12:04:40.230 に答える
0

うまくいけば、typeのインスタンスになりますParameterizedTypeしたがって、 getActualTypeArguments()メソッドを使用できます。

于 2013-03-24T12:14:34.923 に答える
0

私は自分の解決策を見つけました..それが良いかどうかはわかりません

私はTypeこのような2つの変数を比較しています...

if (type.toString().equalsIgnoreCase(
                new TypeToken<List<Test.MyClass>>() {
                }.getType().toString())) {

}else
{

}
于 2013-03-24T12:21:10.617 に答える