58

問題の概要:ArrayList<SomeClass>型パラメーター (たとえば など) を持つクラスを、型パラメーターとしてジェネリック メソッド に渡したいと考えています。

メソッドがあるとしましょう:

    public static <T> T getGenericObjectFromJson(String json, Class<T> genericType){
        // details unimportant, basically returns an object of specified type
        return JsonParser.fromJson(json, genericType); 
    }

もちろん、このメソッドは、どの種類のクラスでも問題なく機能します。たとえば、次のようにメソッドを呼び出すことができます。

getGenericObjectFromJson(jsonString, User.class)

問題:私はこれができないことを発見しました:

getGenericObjectFromJson(jsonString, ArrayList<User>.class)

構文的に、これは明らかに無効です。ただし、このようなことをどのように達成できるかはわかりません。もちろん、 を渡すことはできますがArrayList.class、ジェネリック型を追加すると、構文的に有効ではなくなり、それを回避する方法が思いつきません。

唯一の直接的な解決策は、次のようなものです (かなり間抜けに思えます)。

getGenericObjectFromJson(jsonString, new ArrayList<User>().getClass())

ただし、とにかくジェネリック型を失うことになり、未知の型の ArrayList を返すだけです (ただし、キャストすることはできます)。さらに、不必要にオブジェクトをインスタンス化します。

これまでの私の唯一の解決策は、次のように、インスタンス化できるジェネリック型パラメーターを含むクラスでそのメソッドをラップすることでした。

public class JsonDeserializer<T>...

この場合、getGenericObjectFromJsonメソッドはクラスのジェネリック型を使用します。

質問:最終的に、型パラメーターを使用してクラスを渡すことができない理由と、私が試みたことを達成する方法があるかどうかに興味があります。

いつものように、この質問に問題がある場合はお知らせください。

4

1 に答える 1