2009-08-31 91 views
4

我很新到Java ... 我寫了一個名爲DLPFile 類,這是基本上像字符串,整型,浮點型等對象的容器等Java 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"); 

但沒有工作

我想這是怎樣的一個 「鑄造」 的問題...(也許?)

在此先感謝;)

回答

3

這是因爲泛型類型擦除。當你從會話中得到它時,編譯器無法確定實際的泛型類型參數(除非session.get需要類T >參數來相應地轉換它),因爲會話可能只返回對象的類型。您可以確保您的對象是List的實例,但通用類型信息丟失(基本上,編譯器將其轉換爲內部的List <Object>)。這就是爲什麼你會得到警告,因爲只有你作爲程序員才能知道你想要轉換的泛型類型參數是否正確。

如果你不喜歡的警告,你可以在你的方法開始添加

@SuppressWarnings("unchecked") 

註解。

+0

謝謝,但是有沒有辦法解決警告而不是拒絕? – nacho4d 2009-08-31 12:00:13

+0

你可能有一個'列表',但你想要一個你的文件類型的列表,所以沒有 – pjp 2009-08-31 13:12:39

+0

沒有沒有辦法,因爲泛型是如何在Java中實現的。唯一的方法是讓session對象在get方法中支持泛型參數(但它不會執行任何與未經檢查的轉換不同的操作)。這只是一個警告,不是一個錯誤。列表相當於列表。最好的辦法是從列表派生自己的類,然後你檢查實際類而不是通用接口。 – Daff 2009-08-31 13:33:04

2

您是否知道您在開始時缺少a>?即'列表< DLPFile文件'應該是'列表<DLPFile>'文件'。

+0

我覺得這個角色只是在這裏顯示出來......但不管怎樣,這不是警告的起源。 – nacho4d 2009-08-31 11:59:16

+0

我也使用會話對象來存儲一些不是DLPFile列表的其他對象,這是不按照您的建議映射它的原因。 BTW:Stackoverflow非常有用! – nacho4d 2009-08-31 12:08:34

1

您嘗試的第一個選項是一個你需要的:

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

你沒有任何與仿製藥的第一個警告:鑄造的時候,比如你會得到警告,String以及。編譯器只是告訴你它不能確保返回的對象是List<DLPFile>

第二個關於原始類型的確與泛型有關。如果你使用上面的選項,你不應該得到它,但如果你投到List,你會得到它。它告訴你不應該使用List沒有類型參數,在你的情況下<DLPFile>

+0

我同意你的意見。但我不知道爲什麼這個警告沒有被建議的代碼消失。 (是我第一次嘗試) – nacho4d 2009-08-31 12:05:37

+0

您確定此選項的警告與其他警告相同嗎?因爲其中沒有任何未參數化的引用... – Jorn 2009-08-31 21:42:47

+0

@ nacho4d - 由於仿製藥的工作方式,警告不會消失。他們本質上只是一個編譯時候的技巧;轉換成'List ''基本上與轉換爲'List'完全一樣,因爲編譯器*或*運行時無法檢查列表是否真的「是」列表而不是,比如說一個'List '。這只是讓你意識到你的演員並沒有真正保護你免受這條線上的ClassCastExceptions的侵害。 – 2009-09-08 11:39:06

0

正如其他人所說,在Java中,您不能安全地投射泛型類型。

與其忽略編譯器,解決此問題的更好方法是將更有意義的東西放入會話中。將List包裝在處理這種類型集合的類中。哎呀,甚至可以添加一些實例方法,對列表執行一些有意義的事情,而不是使用getFiles方法。