警告内容:
Type safety: The cast from Object to ArrayList<String> is actually checking 
 against the erased type ArrayList除了添加
@SuppressWarnings("unchecked")
以及 Eclipse 的设置外,是否还有其它办法?

解决方案 »

  1.   

    就添加注解呗 
    @SuppressWarnings("unchecked") 
      

  2.   

    你可以把在方法中定义返回的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的级别。
    除此之外没有其它办法。
      

  3.   

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

  4.   

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

  5.   

    KEY_FORMAT的List也是ArrayList <String>类型的?
      

  6.   

    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;
    }
      

  7.   

    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);
      

  8.   

    To ayueiloveyou :
      确实,如果是 Object 的话,可以不用判断.  回想一下,写出这样的代码,可能是因为原生数据类型的话,如果是 null 值,转换会出异常,于是为了避免出错,一古脑全给加了判断.谢谢,我这就精简代码去,呵呵.但是那个警告,还是有点麻烦,不知道该不该还抱着那份希望.
      

  9.   

    List a=(List)null;
    也不会报错啊,只在你要在使用之前作一下判断(而这是必须的)。
    再者,警告就警告吧,有时编译器也不一定就是对的,你能给session加上泛型吗??不好吧
      

  10.   

    To ayueiloveyou:
      想不起来了,好象是将什么类型转换为 int 时出错吧,刚才试了半天,也找不回以前出错的情况了.
      :(
      

  11.   

    还是用@SuppressWarnings("unchecked")吧
      

  12.   

    就你从当前程序来看,session里应该放引用数据类型,所以你要是强转成int型,一定会出错,那不是空指针异常,而是ClassCaseException类型转换错误
    int a=(int)null;编译是一定通不过的,因为你能把null付给一个对象类型 String s=null,但不能付给基本数据类型(int a=null是不行的)
      

  13.   

    泛型对象的检测是JDK1.5开始加入的新功能,能够在编译时发现类型转换的错误。如果你不想让JDK做这个检测,那么未知的类型转换错误只能在运行时发生,而且不好定位错误的地方。
    如果你想屏蔽这种检查,可采取如下的方法
    1.用JDK1.5以前的版本
    2.或着用@SuppressWarnings("unchecked")
    3.如果是在Eclipse下开发的话,还可以更改Eclipse的编译属性,在 windows-设定-java-compile-错误和警告 里面有不检查泛型 这个选项。改成无视就行了
      

  14.   

    偶也发下代码,范型都很熟悉了,就是往集合类或接口里面转载数据的时候要设置为具体的类型。
    也就是传说中的装箱和拆箱操作。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);
    }



            
    }}
      

  15.   

    这也是Java对于泛型支持比较薄弱的地方。
      

  16.   

    今天再看代码的时候,突然有个想法:
    在往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());
    }
      

  17.   

    在JDK1.5以上的版本中用泛型就可以了!
       注意是1.5以上的版本中