2

特定のオブジェクトを取得するためのキャッシュ用の関数を作成しました。このように私はそれをキャストする必要はありません。

@SuppressWarnings("unchecked")
    public static <T> T inCache(Class<T> obj, String token) {

        Object cacheObj = Cache.get(token);
        if (cacheObj != null) {

            if (obj.isAssignableFrom(cacheObj.getClass())) {
                return (T) cacheObj;
            }
        }
        return null;

    }

こんな感じで使っています

String s = inCache(String.class, title);

しかし、今はキャッシュに文字列のリストがあり、このように使用することはできません

List<String> ipList = Util.inCache(List<String>.class, title);

問題はList<String>.classです。私はJavaを初めて使用しますが、どのようにJavaを作成する必要がありますか?

4

5 に答える 5

6

Javaには型消去と呼ばれる概念があります。従来の理由により、List のようなものは単なるリストです。実行時に文字列のリストであることを覚えていません。List.class と書くだけです。

その後、オブジェクトを反復処理するときに、リスト内のオブジェクトのタイプを指定できます。

于 2012-08-17T16:13:20.503 に答える
4

のクラスを取得することはできませんList<String>。あなたの場合、唯一の方法は次のとおりです。

List<String> ipList = (List<String>)Util.inCache(List.class, title);
于 2012-08-17T16:14:24.933 に答える
1

あなたが試すことができます :

List<String> ipList = Util.inCache(List.class, title);
于 2012-08-17T16:24:24.807 に答える
1

List <String>ジョーの答えを明確にするために(コメントするのに十分な評判がありません)、実行時に aとList<Integer>または他のタイプの の間に違いはなくList、ジェネリックは実行時に保持されません。

つまり、List<String>.classは と完全に同一でList<Integer>.classあり、実際にはList.classです。これは、Java 型システムの弱点です。あなたが望むものを実装する簡単な方法に慣れていません。

それの一体のコード証明:

// It is true that      
    List<String> stringList = new ArrayList<String>(); 
    List<Integer> integerList = new ArrayList<Integer>();                                               
    System.out.println( stringList.getClass() == integerList.getClass()  );

    // And that ... 
    List objectList = new ArrayList();
    System.out.println( stringList.getClass() == objectList.getClass()  );

    //However, the following is false because a different implementation is used ( I wanted a false case)
    List objectLinkedList = new LinkedList();
    System.out.println(  objectLinkedList.getClass() == objectList.getClass() );
于 2012-08-17T19:03:01.813 に答える
1

これを試して-

List<String> inList = (List<String>)Test.inCache(List.class, title);

そして、あなたもできる -

List<String> inList = Test.inCache((Class<? extends List<String>>)List.class, token);
于 2012-08-17T16:31:53.443 に答える