如何避免 Object 到 ArrayList(泛型)转换时的警告?

mostone 2008-05-23 10:59:56
警告内容:
Type safety: The cast from Object to ArrayList<String> is actually checking
against the erased type ArrayList

除了添加
@SuppressWarnings("unchecked")
以及 Eclipse 的设置外,是否还有其它办法?
...全文
1989 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Senton 2010-06-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 ayueiloveyou 的回复:]

Object value;
ArrayList<String> formatList = null;
value = session.getAttribute(KEY_FORMAT);
if (value != null){
formatList = (ArrayList<String>)value; // 此行被警告
}红色部……
[/Quote]

太有才了
burningice44 2008-05-26
  • 打赏
  • 举报
回复
直接完全使用泛型
jdlsfl 2008-05-26
  • 打赏
  • 举报
回复
添加@SuppressWarnings("unchecked")
刘彬彬 2008-05-26
  • 打赏
  • 举报
回复
在JDK1.5以上的版本中用泛型就可以了!
注意是1.5以上的版本中
mostone 2008-05-26
  • 打赏
  • 举报
回复
今天再看代码的时候,突然有个想法:
在往session里存数据时,对几个泛型对象,做个包装就可以了,但是多了一个包装类,如果有现成的包装类就更好了.
示例代码:

private final String SESSION_KEY = "JN050_SESSION";

private void saveToSession(HttpServletRequest request, JN050ActionForm form){
HttpSession session = request.getSession();

JN050ActionForm sessionForm = new JN050ActionForm();
sessionForm.setCsvFileFormatList(form.getCsvFileFormatList());
sessionForm.setErrorMessages(form.getErrorMessages());
sessionForm.setFullList(form.getFullList());
sessionForm.setPageList(form.getPageList());
sessionForm.setRootCodeMap(form.getRootCodeMap());

session.setAttribute(SESSION_KEY, sessionForm);
}

private void restoreFromSession(HttpServletRequest request, JN050ActionForm form){
HttpSession session = request.getSession();

JN050ActionForm sessionForm = (JN050ActionForm)session.getAttribute(SESSION_KEY);
form.setCsvFileFormatList(sessionForm.getCsvFileFormatList());
form.setErrorMessages(sessionForm.getErrorMessages());
form.setFullList(sessionForm.getFullList());
form.setPageList(sessionForm.getPageList());
form.setRootCodeMap(sessionForm.getRootCodeMap());
}
zenny_chen 2008-05-24
  • 打赏
  • 举报
回复
这也是Java对于泛型支持比较薄弱的地方。
jdlsfl 2008-05-24
  • 打赏
  • 举报
回复
这样的泛型警告可以忽略的
我是小辉辉 2008-05-23
  • 打赏
  • 举报
回复
List a=(List)null;
也不会报错啊,只在你要在使用之前作一下判断(而这是必须的)。
再者,警告就警告吧,有时编译器也不一定就是对的,你能给session加上泛型吗??不好吧
mostone 2008-05-23
  • 打赏
  • 举报
回复
To ayueiloveyou :
确实,如果是 Object 的话,可以不用判断.

回想一下,写出这样的代码,可能是因为原生数据类型的话,如果是 null 值,转换会出异常,于是为了避免出错,一古脑全给加了判断.

谢谢,我这就精简代码去,呵呵.

但是那个警告,还是有点麻烦,不知道该不该还抱着那份希望.
我是小辉辉 2008-05-23
  • 打赏
  • 举报
回复
Object value;
ArrayList<String> formatList = null;
value = session.getAttribute(KEY_FORMAT);
if (value != null){
formatList = (ArrayList<String>)value; // 此行被警告
}
红色部分多余,你不觉得吗,是null付给formatList也没什么啊,本来他就是null;
改成:
ArrayList<String> formatList = (ArrayList<String>)session.getAttribute(KEY_FORMAT);
goodmrning 2008-05-23
  • 打赏
  • 举报
回复
ding
yuzhu2008 2008-05-23
  • 打赏
  • 举报
回复
偶也发下代码,范型都很熟悉了,就是往集合类或接口里面转载数据的时候要设置为具体的类型。
也就是传说中的装箱和拆箱操作。



package com.sytdc.cxl;

import java.util.ArrayList;

public class ZhenZeTest {

/**
* @param args
*/
public static void main(String[] args) {

ArrayList<String> ar = new ArrayList<String>();
ar.add("001");
ar.add("003");
ar.add("002");
ar.add("004");

for(String o:ar){
System.out.println("000 == "+ o);
}
ArrayList<Integer> ar2 = new ArrayList<Integer>();
ar2.add(001);
ar2.add(003);
ar2.add(002);
ar2.add(004);

for(Integer o:ar2){
System.out.println("000 ==2 "+ o);
}




}

}

mostone 2008-05-23
  • 打赏
  • 举报
回复
session 中的对象是 ArrayList<String> 类型的,因此需要提取后作转换.

若是加 @Supp... 则如果后续添加的代码有 ArrayList 定义未使用泛型的话,就看不出来了.

如果真的没有办法,那估计只能让它显示着,别扭一点就别扭点吧.

另外,不知道对于泛型对象的类型检查如何做,是这样吗:

		Object value;
ArrayList<String> formatList = null;

value = session.getAttribute(KEY_FORMAT);
if ((new ArrayList<String>()).getClass().isInstance(value)){
formatList = (ArrayList<String>)value;
}
anqini 2008-05-23
  • 打赏
  • 举报
回复
KEY_FORMAT的List也是ArrayList <String>类型的?
lalawood 2008-05-23
  • 打赏
  • 举报
回复
还是强制转换吧。。
lovingprince 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 imA 的回复:]
你可以把在方法中定义返回的List对象为List <String>,而不是List。


如果你没有那个方法的源代码,那只能是添加@SuppressWarnings("unchecked")

当然你可以在eclipse的Window->Preferences->Java->Compiler->Errors/Warning->Generic types中将Unchecked generic type operation设置为Ignore。

你还可以在eclipse的Window->Preferences->Java->Compiler将Compiler compliance level 设置为小于5.0的级别。


除…
[/Quote]
正解
mostone 2008-05-23
  • 打赏
  • 举报
回复
代码:
		HttpSession session = request.getSession();

Object value;
ArrayList<String> formatList = null;
value = session.getAttribute(KEY_FORMAT);
if (value != null){
formatList = (ArrayList<String>)value; // 此行被警告
}

mostone 2008-05-23
  • 打赏
  • 举报
回复
代码:
HttpSession session = request.getSession();

Object value;
ArrayList<String> formatList = null;
value = session.getAttribute(KEY_FORMAT);
if (value != null){
formatList = (ArrayList<String>)value; // 此行被警告
}
hoszone 2008-05-23
  • 打赏
  • 举报
回复
关注一下
imA 2008-05-23
  • 打赏
  • 举报
回复
你可以把在方法中定义返回的List对象为List<String>,而不是List。


如果你没有那个方法的源代码,那只能是添加@SuppressWarnings("unchecked")

当然你可以在eclipse的Window->Preferences->Java->Compiler->Errors/Warning->Generic types中将Unchecked generic type operation设置为Ignore。

你还可以在eclipse的Window->Preferences->Java->Compiler将Compiler compliance level 设置为小于5.0的级别。


除此之外没有其它办法。
加载更多回复(9)

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧