将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