4

我对 Java 很陌生……我写了一个名为 DLPFile 的类,它基本上是其他对象的容器,如字符串、整数、浮点数等。

将我的文件放入 List 然后将其保存在我的会话中(来自 Map 类)变量很容易;

DLPFile file = new DLPFile();
List <DLPFile >fileList =  new ArrayList <DLPFile>();
fileList.add(file);
session.put("filesList", fileList);

但是如何从会话变量中检索列表?当我做:

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

但没有一个有效

我想这是一种“铸造”问题......(也许?)

提前致谢 ;)

4

5 回答 5

3

这是因为泛型类型擦除。当您从会话中获取它时,编译器无法确定实际的泛型类型参数(除非您 session.get 需要一个 Class<T> 参数来相应地转换它),因为会话可能只返回对象的类型。您可以确保您的对象是 List 的实例,但通用类型信息会丢失(基本上编译器会在内部将其转换为 List<Object>)。这就是您收到警告的原因,因为只有作为程序员的您才能知道要将其强制转换为的泛型类型参数是否正确。

如果您不喜欢该警告,您可以添加

@SuppressWarnings("unchecked")

方法开头的注释。

于 2009-08-31T08:23:11.540 回答
2

您是否知道一开始就缺少 > ?即“列出<DLPFile 文件”应该是“列出<DLPFile> 文件”。

于 2009-08-31T08:16:41.023 回答
2

这个选项应该没问题

List <DLPFile> files = (List <DLPFile>) session.get("fileslist"); 

尽管您会收到未经检查的演员表警告,因为我不希望您的会话是Map<String, List<DLPFile>>.

查看 Java 泛型常见问题解答http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

于 2009-08-31T08:20:49.733 回答
1

您尝试的第一个选项是您需要的选项:

List<DLPFile> files = (List<DLPFile>) session.get("fileslist");

您收到的第一个警告与泛型没有任何关系:例如,您也会在转换为时收到警告String。编译器只是告诉你它不能确保返回的对象是List<DLPFile>.

第二个,关于原始类型,确实与泛型有关。如果你使用上面的选项,你不应该得到它,但如果你转换为 just List,你会得到它。它告诉你List,在你的情况下,你不应该在没有类型参数的情况下使用<DLPFile>

于 2009-08-31T08:31:09.497 回答
0

正如其他人所说,在 Java 中,您不能安全地转换泛型类型。

与其忽略编译器,解决这个问题的更好方法是在会话中加入一些更有意义的东西。将 包装List在一个处理这种类型集合的类中。哎呀,甚至添加一些对列表做有意义的事情的实例方法,而不是一个getFiles方法。

于 2009-08-31T08:43:42.810 回答