我对Java很新... 我写了一个名为DLPFile的类 它基本上是其他对象的容器,如字符串,整数,浮点数等。
将我的文件放入List然后将其保存在我的会话中(来自Map类)变量很容易;
DLPFile file = new DLPFile();
List <DLPFile >fileList = new ArrayList <DLPFile>();
fileList.add(file);
session.put("filesList", fileList);
但如何从会话var中检索列表? 当我这样做时:
List <DLPFile files = (List) session.get("fileslist");
我收到了一些警告:
"List is a raw type.References to generic type List<E> should be parameterized."
我试过
List <DLPFile files = (List <DLPFile> ) session.get("fileslist");
List <DLPFile files = (List ) session.get("fileslist")<DLPFile>; and
List <DLPFile files = (List) <DLPFile> session.get("fileslist");
但没有效果
我认为这是一种“铸造”问题......(也许?)
提前致谢;)
答案 0 :(得分:3)
这是因为泛型类型擦除。当你从会话中获取它时,编译器无法确定实际的泛型类型参数(除非你的session.get采用Class&lt; T&gt;参数来相应地转换它),因为会话可能只返回对象的类型。您可以确保您的对象是List的实例,但是泛型类型信息会丢失(基本上编译器会将其转换为List&lt; Object&gt;内部)。这就是你得到警告的原因,因为只有你作为程序员才能知道你想要将它投射到的泛型类型参数是正确的。
如果您不喜欢警告,可以添加
@SuppressWarnings("unchecked")
方法开头的注释。
答案 1 :(得分:2)
你知道你错过了一个&gt;在开始时?即'List&lt; DLPFile files'应为'List&lt; DLPFile&gt;'文件。
答案 2 :(得分:2)
此选项应该没问题
List <DLPFile> files = (List <DLPFile>) session.get("fileslist");
虽然您会收到未经检查的投射警告,因为我认为您的会话不是Map<String, List<DLPFile>>
。
浏览Java Generics FAQ http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
答案 3 :(得分:1)
您尝试的第一个选项是您需要的选项:
List<DLPFile> files = (List<DLPFile>) session.get("fileslist");
您获得的第一个警告与泛型没有任何关系:例如,在转换为String
时,您会收到警告。编译器只是告诉你它不能确保返回的对象是List<DLPFile>
。
第二个,关于原始类型,确实与泛型有关。如果你使用上面的选项,你就不应该得到它,但如果你只使用List
,你就会得到它。它告诉您在List
的情况下不应使用<DLPFile>
而不使用type参数。
答案 4 :(得分:0)
正如其他人所说,在Java中你无法安全地转换泛型类型。
不是忽略编译器,解决这个问题的更好方法是在会话中加入一些更有意义的东西。将List
包装在处理此类型集合的类中。哎呀,甚至添加一些实例方法,这些方法对列表做了一些有意义的事情,而不是getFiles
方法。