Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建静态';对象持有者';在Java中使用泛型初始化_Java_Generics - Fatal编程技术网

如何创建静态';对象持有者';在Java中使用泛型初始化

如何创建静态';对象持有者';在Java中使用泛型初始化,java,generics,Java,Generics,我试图创建一个简短的对象类。 例如, public ResponseAbc bringMeStuff(RequestAbc request){ ResponseAbc response = new ResponseAbc(); /* Setting request here.. */ response = bringMeLotsOfStuff(request); /* Here I am calling the Util class */ Util.putToObjectHolder("myA

我试图创建一个简短的对象类。 例如,

public ResponseAbc bringMeStuff(RequestAbc request){
ResponseAbc response = new ResponseAbc();
/* Setting request here.. */
response = bringMeLotsOfStuff(request);

/* Here I am calling the Util class */
Util.putToObjectHolder("myAbcResponse", response);
return response;
}

public void testMe(){
/* Testing objectHolder */
ResponseAbc newResponse = (ResponseAbc) Util.getFromObjectHolder("response");
}
下面是Util类

public class Util<T> {
private static Util<?> instance = null;
private Map<String, T> objHolder;

private Util() {
}
/* I strongly think Util class should be singleton if I want to hold the map globally */

public static Util<?> getInstance() {
    if (instance == null) {
        instance = new Util();
    }
    return instance;
}

public static <T> void putToObjectHolder(String objectName, T objectType) {
    // Map<String, T> holder = (Map<String, T>) getInstance().getObjHolder();
    // holder.put(objectName, objectType);
    getInstance().getObjHolder().put(objectName, objectType); //-> Argument error
}

public static <T> Object getFromObjectHolder(final String objectName) {
    Map<String, T> holder = (Map<String, T>) getInstance().getObjHolder();
    T obj = null;
    for (Entry<String, T> entry : holder.entrySet()) {
        if (entry.getKey().equals(objectName)) {
            obj = entry.getValue();
        } else {
            obj = null;
        }
    }
    return obj;
}

public Map<String, T> getObjHolder() {
    if (objHolder == null) {
        objHolder = new HashMap<String, T>();
    }
    return objHolder;
}

public void setObjHolder(Map<String, T> objHolder) {
    this.objHolder = objHolder;
}
}
公共类Util{
私有静态Util实例=null;
私人地图objHolder;
私有Util(){
}
/*我强烈认为,如果我想全局保存映射,Util类应该是单例的*/
公共静态Util getInstance(){
if(实例==null){
instance=newutil();
}
返回实例;
}
公共静态void putToObjectHolder(字符串objectName,T objectType){
//映射持有者=(映射)getInstance().getObjHolder();
//holder.put(objectName,objectType);
getInstance().getObjHolder().put(objectName,objectType);//->参数错误
}
公共静态对象getFromObjectHolder(最终字符串objectName){
映射持有者=(映射)getInstance().getObjHolder();
T obj=null;
for(条目:holder.entrySet()){
if(entry.getKey().equals(objectName)){
obj=entry.getValue();
}否则{
obj=null;
}
}
返回obj;
}
公共地图getObjHolder(){
if(objHolder==null){
objhold=newhashmap();
}
返回objHolder;
}
公共void setObjHolder(映射objHolder){
this.objHolder=objHolder;
}
}
如果我取消对putToObjectHolder方法的注释,它会工作,但我不确定它是否应该这样工作。我的意思是创建一个其他地图并分配给它应该可以做到这一点

我想做的是用一个实例保存一个静态映射持有者,这样我就可以用一个名称放置我想要的任何对象,并且只要该对象存在于该“全局持有者”中,就可以随时获取该对象

PS:当然,它的类型安全警告非常混乱,我也想改进它,尽管我不知道如何改进


提前感谢。

您使用的不是泛型。看看ArrayList类,了解泛型的真正潜力

同样,这个类的单例也没有任何用途,因为您只需要HashMap的“单例”

也许我看不到你想要完成什么,但这基本上就是你想要做的。你为什么不直接用一个HashMap就可以了

import java.util.HashMap;

public class Util {

    private static HashMap<String, Object> values = new HashMap<String, Object>;        

    private Util() {
    }

    public static void put(String key, Object value) {
        values.put(key, value);
    }

    public static Object get(String key) {
        return values.get(key);
    }

    public static void main(String[] args) {
        String s = "This is a test.";
        Util.put("test", s);
        System.out.println(Util.get("test"));
        System.out.println(Util.get("another test"));
    }
}
import java.util.HashMap;
公共类Util{
私有静态HashMap值=新HashMap;
私有Util(){
}
公共静态void put(字符串键、对象值){
value.put(键、值);
}
公共静态对象get(字符串键){
返回值.get(key);
}
公共静态void main(字符串[]args){
String s=“这是一个测试。”;
Util.put(“测试”,s);
System.out.println(Util.get(“test”);
System.out.println(Util.get(“另一个测试”);
}
}

抛开单例部分不谈,您是否试图使用泛型在保持类型安全的同时将对象(不同类型的)放入和移出同一映射?也就是说,如果您将一个字符串放入映射(对于给定的键),那么只有将该值分配给(或用作)一个字符串时,才能将该值导出。(此外,代码中没有强制转换。)

这是可以做到的,但有点复杂,因为您需要定义具有相应值类型的键

见:

约书亚·布洛克(Joshua Block)在某个地方也有一篇关于这方面的好文章,但我似乎找不到


这似乎是您试图通过put方法实现的目标。不过,您无法使用字符串作为键,您需要一个通用的、键入的键。

感谢您的解释,这对解决我头脑中的主要问题有很大帮助。