Java 如何删除SuppressWarning(“未选中”)

Java 如何删除SuppressWarning(“未选中”),java,generics,Java,Generics,是否有任何方法可以更改此代码,以便删除未检查的警告 ArrayList<String> keys = new ArrayList<String>(); // do some stuff then // save keys in session HttpServletRequest request = getThreadLocalRequest(); HttpSession session = request.getSession(true); session.setAtt

是否有任何方法可以更改此代码,以便删除未检查的警告

ArrayList<String> keys = new ArrayList<String>();
// do some stuff then
// save keys in session
HttpServletRequest request = getThreadLocalRequest();
HttpSession session = request.getSession(true);
session.setAttribute(uuid, keys);

// get keys from session sometime later
@SuppressWarnings("unchecked")
ArrayList<String> keys = (ArrayList<String>) session.getAttribute(uuid);
ArrayList keys=new ArrayList();
//那就做点什么吧
//在会话中保存密钥
HttpServletRequest=getThreadLocalRequest();
HttpSession session=request.getSession(true);
session.setAttribute(uuid,key);
//稍后从会话获取密钥
@抑制警告(“未选中”)
ArrayList keys=(ArrayList)session.getAttribute(uuid);

好吧,你必须在以下两者之间进行选择:

  • 原始类型警告
  • 未经检查的转换警告
  • 注释以删除原始类型的警告
  • 注释以删除未选中转换的警告
问题是
getAttribute()
返回一个
对象
,因此编译器不知道
对象
是一个
数组列表
,因此它警告您,如果
对象
不是
数组列表
,就会出现问题


您可以取消参数化
ArrayList
,这样它将接受任何内容的
列表(因此不需要转换,从而删除未选中转换的警告),但随后您会得到另一个原始类型的警告。

您不能<代码>会话。getAttribute()
的类型不安全

您可以创建一个包装器方法,以便只在一个位置具有
@SuppressWarnings

public final class SessionUtils {
    @SuppressWarnings("unchecked")
    public static <T> T getSessionAttribute(HttpSession session, String name) {
        return (T) session.getAttribute(name);
    }
}
public final class SessionUtils{
@抑制警告(“未选中”)
公共静态T getSessionAttribute(HttpSession会话,字符串名称){
return(T)session.getAttribute(name);
}
}
然后,您可以在没有警告的情况下使用:

List<String> keys = SessionUtils.getAttribute(session, uuid);
List keys=SessionUtils.getAttribute(会话,uuid);

+1以方便使用T参数。我猜这是从指定变量读取的,对吗?