Java 返回泛型对象

Java 返回泛型对象,java,caching,Java,Caching,我正在创建一个对象缓存。我在编写泛型的方法返回类型(请参见GetCachedCMObject)时遇到问题,因此我不必按照注释中的指示强制转换返回。我想我可以接受它,但我宁愿使用泛型 CachedCMObject是一个使用“异构集合”模式的独立对象,但我认为这在本例中并不重要,也与我的问题无关 package util; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class CMSOb

我正在创建一个对象缓存。我在编写泛型的方法返回类型(请参见GetCachedCMObject)时遇到问题,因此我不必按照注释中的指示强制转换返回。我想我可以接受它,但我宁愿使用泛型

CachedCMObject是一个使用“异构集合”模式的独立对象,但我认为这在本例中并不重要,也与我的问题无关

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);
    }
}
package-util;
导入java.util.Map;
导入java.util.concurrent.ConcurrentHashMap;
公共类CMSObjectCache{
静态映射cachedCMSObject=新的ConcurrentHashMap();
公共静态void putCachedCMSObject(字符串cmsKey、CMSObject、CMSObject){
cachedCMSObject.put(cmsKey,cmsObject);
}
公共静态对象GetCachedCMObject(字符串objectKey,类clazz){
CMSObject c2=cachedCMSObject.get(objectKey);
返回c2.getCMSObject(Integer.class);//返回泛型类型?
}
公共静态void main(字符串[]args){
CMSObject-CMSObject;
//放置键为“Int:3”的整型对象
PutCachedCMObject(“Int:3”,新的CMSObject(Integer.class,3));
//从缓存中获取该对象
Integer i3=(Integer)GetCachedCMObject(“Int:3”,Integer.class);//需要吗?
系统输出打印Ln(i3);
}
}
这就是CMSObject的样子(来自Bloch)

package-util;
导入java.util.HashMap;
导入java.util.Map;
公共最终类CMSObject{
私有映射,对象>();
公共CMSObject(){
}
公共CMSObject(类类型,T实例){
this.putCMSObject(类型、实例);
}
public void putCMSObject(类类型,T实例){
if(type==null){
抛出新的NullPointerException(“类型为null”);
}
cmsObject.put(类型、实例);
}
公共T getCMSObject(类类型){
返回类型.cast(cmsObject.get(type));
}
}

您的问题还不清楚,但我只能假设您正朝着这样的方向发展:

class CMSObject{
   public <T> T getCMSObject(Class<T> klass) {
       //...
   } 
}
类CMSObject{
公共T getCMSObject(klass类){
//...
} 
}
然后你的外部方法应该有点像

public static <T> T getCachedCMSObject(String objectKey, Class<T> clazz) {
    CMSObject c2 = cachedCMSObject.get(objectKey);
    return c2.getCMSObject(clazz);  // return generic type ?
}
publicstatict getCachedCMSObject(stringobjectkey,Class clazz){
CMSObject c2=cachedCMSObject.get(objectKey);
返回c2.getCMSObject(clazz);//返回泛型类型?
}

CMSObject的定义是什么?
public static <T> T getCachedCMSObject(String objectKey, Class<T> clazz) {
    CMSObject c2 = cachedCMSObject.get(objectKey);
    return c2.getCMSObject(clazz);  // return generic type ?
}