0

オブジェクトキャッシュを作成しています。汎用のメソッドreturnタイプ( getCachedCMSObjectを参照)を作成するのに問題があるため、コメントに示されているようにreturnをキャストする必要はありません。私はそれと一緒に暮らすことができると思いますが、私はむしろジェネリックを使用したいと思います。

cachedCMSObjectは、「Heterogeneous Collection」パターンを使用する別個のオブジェクトですが、この場合は重要ではないと思います。また、私の問題とは関係ありません。

package util;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class CMSObjectCache {
    static Map<String, CMSObject> cachedCMSObject = new ConcurrentHashMap<String, CMSObject>();

    public static void putCachedCMSObject(String cmsKey, CMSObject cmsObject) {
        cachedCMSObject.put(cmsKey, cmsObject);
    }

    public static Object getCachedCMSObject(String objectKey, Class<?> clazz) {
        CMSObject c2 = cachedCMSObject.get(objectKey);
        return c2.getCMSObject(Integer.class);  // return generic type ?
    }

    public static void main(String[] args) {
        CMSObject cmsObject;

        // put object of type Integer with key "Int:3"
        putCachedCMSObject("Int:3", new CMSObject(Integer.class, 3));

        // Get that object from the cache
        Integer i3 = (Integer) getCachedCMSObject("Int:3", Integer.class);  // necessary? 
        System.out.println(i3);
    }
}

これは、CMSObjectが(Blochから)どのように見えるかです。

package util;

import java.util.HashMap;
import java.util.Map;

public final class CMSObject {
    private Map<Class<?>, Object> cmsObject = new HashMap<Class<?>, Object>();

    public CMSObject() {
    }

    public <T> CMSObject(Class<T> type, T instance) {
        this.putCMSObject(type, instance);
    }

    public <T> void putCMSObject(Class<T> type, T instance) {
        if (type == null) {
            throw new NullPointerException("Type is null");
        }
        cmsObject.put(type, instance);
    }

    public <T> T getCMSObject(Class<T> type) {
        return type.cast(cmsObject.get(type));
    }
}
4

1 に答える 1

2

あなたの質問ではまだ明確ではありませんが、次のような方向に向かっているとしか思えません。

class CMSObject{
   public <T> T getCMSObject(Class<T> klass) {
       //...
   } 
}

そして、あなたの外側の方法はやや似ているはずです

public static <T> T getCachedCMSObject(String objectKey, Class<T> clazz) {
    CMSObject c2 = cachedCMSObject.get(objectKey);
    return c2.getCMSObject(clazz);  // return generic type ?
}
于 2012-05-29T17:54:42.303 に答える