【问题标题】:Java List parameterized?Java List 参数化?
【发布时间】:2009-08-31 08:13:05
【问题描述】:

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

将我的文件放入列表然后将其保存在我的会话中(来自 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");

但没有一个有效

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

提前致谢;)

【问题讨论】:

    标签: java generics list parameterized


    【解决方案1】:

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

    如果你不喜欢这个警告,你可以添加一个

    @SuppressWarnings("unchecked")
    

    方法开头的注释。

    【讨论】:

    • 谢谢,...但是有没有办法可以解决警告而不是抑制它?
    • 你可以有一个“列表>”但是你想要一个你的文件类型的列表,所以没有
    • 不,没有办法,因为泛型是如何在 Java 中实现的。唯一的方法是让会话对象支持 get 方法中的通用参数(但它不会做任何与未经检查的强制转换不同的事情)。这只是一个警告,而不是错误。 List> 等效于 List。最好的方法是从 List 派生您自己的类,因为然后您检查的是实际类而不是通用接口。
    【解决方案2】:

    你知道你在开头缺少一个 > 吗?即“列出 ”文件。

    【讨论】:

    • 我认为这个角色只是没有出现在这里......但无论如何,这不是警告的起源。
    • 我也在使用会话对象来存储一些不是 DLPFile 列表的其他对象,这就是没有按照您的建议映射它的原因。顺便说一句:Stackoverflow 非常有用!!
    【解决方案3】:

    这个选项应该没问题

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 我同意你的看法。但我不知道为什么警告没有随着建议的代码消失。 (是我第一次尝试)
      • 您确定此选项的警告与其他选项相同吗?因为里面没有任何未参数化的引用...
      • @nacho4d - 由于泛型的工作方式,警告不会消失。它们本质上只是一个编译时技巧;转换为List&lt;DLPFile&gt; 基本上与转换为List 完全相同,因为要么 编译器 运行时无法检查列表是否真的“是” " List&lt;DLPFile&gt; 而不是 List&lt;String&gt;。它只是让你意识到你的演员并没有真正保护你免受这条线上的 ClassCastExceptions 的影响。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        • 2015-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-13
        相关资源
        最近更新 更多