gpt4 book ai didi

java - 将 java 遗留代码转换为泛型——如何用类型替换对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:58 25 4
gpt4 key购买 nike

//遗留代码

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

那么,正确的做法是什么?

最佳答案

这确实不可能。您需要通过“具体”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);

关于java - 将 java 遗留代码转换为泛型——如何用类型替换对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2783613/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com