Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java列表参数化?_Java_Generics_List_Parameterized - Fatal编程技术网

Java列表参数化?

Java列表参数化?,java,generics,list,parameterized,Java,Generics,List,Parameterized,我对Java很陌生。。。 我写了一个叫做DLPFile的类 它基本上是其他对象的容器,比如字符串、int、float等 当把我的文件放入一个列表中,然后将其保存在我的会话(来自Map类)变量中是很容易的 DLPFile file = new DLPFile(); List <DLPFile >fileList = new ArrayList <DLPFile>(); fileList.add(file); session.put("filesList", fileLis

我对Java很陌生。。。 我写了一个叫做DLPFile的类 它基本上是其他对象的容器,比如字符串、int、float等

当把我的文件放入一个列表中,然后将其保存在我的会话(来自Map类)变量中是很容易的

DLPFile file = new DLPFile();
List <DLPFile >fileList =  new ArrayList <DLPFile>();
fileList.add(file);
session.put("filesList", fileList);
DLPFile file=new DLPFile();
List fileList=newarraylist();
fileList.add(文件);
session.put(“文件列表”,fileList);
但是如何从会话变量中检索列表呢? 当我这样做时:

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

List您是否意识到您在开始时缺少一个>?i、 这个选项应该可以

List <DLPFile> files = (List <DLPFile>) session.get("fileslist"); 
List files=(List)session.get(“fileslist”);
尽管你会得到一个未经检查的强制类型转换警告,因为我不希望你的会话是
映射


查看Java泛型常见问题解答

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

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

@SuppressWarnings("unchecked")

方法开头的注释。

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

List<DLPFile> files = (List<DLPFile>) session.get("fileslist");
List files=(List)session.get(“fileslist”);
您得到的第一个警告与泛型没有任何关系:例如,您在转换到
String
时也会得到警告。编译器只是告诉您它不能确保返回的对象是
列表


第二个是关于原始类型的,与泛型有关。如果您使用上面的选项,您不应该得到它,但是如果您仅转换到
列表
,您将得到它。它告诉您不应该在没有type参数的情况下使用
List
,在您的情况下,正如其他人所说,在Java中,您不能安全地强制转换泛型类型


与其忽略编译器,解决此问题的更好方法是在会话中加入更有意义的内容。将
列表
包装到处理此类类型集合的类中。见鬼,甚至添加一些对列表有意义的实例方法,而不是
getFiles
方法。

我认为这个字符只是没有出现在这里。。。但无论如何,这并不是警告的来源。我还使用session对象来存储一些不是DLPFile列表的其他对象,这就是为什么不按照您的建议映射它的原因。顺便说一句:Stackoverflow非常有用!!谢谢但是有没有一种方法可以解决这个警告而不是阻止它呢?你可以有一个“列表”,但是你想要一个文件类型的列表,所以没有一种方法,因为泛型是如何在Java中实现的。唯一的方法是session对象在get方法中支持泛型参数(但它与未检查的强制转换没有任何不同)。这只是一个警告,不是错误。列表是列表的等价物。最好的方法是从列表中派生出你们自己的类,因为你们要检查的是一个实际的类,而不是一个泛型接口。我同意你们的观点。但我不知道为什么警告与建议的代码不一致。(是我第一次尝试)您确定此选项的警告与其他选项的警告相同吗?因为其中没有任何未经参数化的引用…@nacho4d-警告不会因为泛型的工作方式而消失。它们本质上只是一个编译时技巧;强制转换到
列表
基本上与强制转换到
列表
完全相同,因为编译器或运行时都无法检查列表是否真的是一个
列表
,而不是一个
列表
。这只是让你意识到你的演员阵容并没有真正保护你免受这一行的ClassCastException的影响。
@SuppressWarnings("unchecked")
List<DLPFile> files = (List<DLPFile>) session.get("fileslist");