编程语言
首页 > 编程语言> > 将Java旧版代码转换为通用代码-如何用类型替换Object?

将Java旧版代码转换为通用代码-如何用类型替换Object?

作者:互联网

//遗留代码

void setCacheValue(String name, Object value){
    getServletContext().setAttribute(name, value);
}
Object getCacheValue(String name){
    return getServletContext().getAttribute(name);
}

//因此,我想将泛型用于“类型安全”

// first, set method seems working perfectly
<T> void setCacheObject(String name, T value){
    getServletContext().setAttribute(name, value);
}

//然后,麻烦来了

<T> T getCacheValue(String name){    
    // of course, I cannot change servlet class - it returns Object type
    Object value = getServletContext().getAttribute(name);
    // would this work:     
    return  (T) value;
    // this cast is meaningless... but how should I do it?
}

//这是我在干净的调用代码中要实现的目标:

{
    double x = 1.2;
    setCacheValue("x", x);
    //...
    // later
    Double value = getCacheValue("x");
    // too bad cannot use primitive type - it cannot handle null

}

那么,这样做的正确方法是什么?

解决方法:

确实是不可能的.您需要以某种方式将“ concrete” T作为方法参数传递,以便在运行时知道实际类型.常用的方法是将其作为Class< T>传递,以便可以使用Class#cast()

<T> T getCacheValue(String name, Class<T> type) {
    return type.cast(getServletContext().getAttribute(name));
}

您可以按以下方式使用它:

Double value = getCacheValue("x", Double.class);

标签:generics,legacy,type-safety,java
来源: https://codeday.me/bug/20191210/2099062.html