2011-03-15 36 views
4

我一直在研究有關使用Java和數據庫的事情。我使用一個數據庫抽象層,並得到我的結果是這樣的:Java,通用啓用對象列表的隱式和顯式類型轉換

Hashtable h = connection.selectRow("select * from table where id = 5"); 

然而,在相同的格式返回的行數時,它返回:

ArrayList<Hashtable> a = connection.selectAll("select * from table where id > 5"); 

現在,因爲我喜歡仿製藥,我想用

ArrayList<Hashtable<String,String>> a = connection.selectAll("select * from table where id > 5"); 

充分利用它但這不會編譯:

Cannot convert from ArrayList<Hashtable> to ArrayList<Hashtable<String,String>>. 

然而,分裂這個樣子,它的工作原理:

ArrayList<Hashtable> a = connection.selectAll("select * from table where id > 5"); 
Hashtable<String,String> h = a.get(0); 

這隻能產生一種類型的安全警示:

Type safety: The expression of type Hashtable needs unchecked conversion to conform to Hashtable<String,String>. 

看來,如果一個臺階上方會做同樣的,因爲這些這裏有兩行代碼,但是被合併爲一個Java拒絕執行轉換。我懷疑一些內部機制負責這種行爲,但尚未找到原因。

有人會照顧精心製作嗎?

編輯:只是爲了澄清。當在我的例子中,錯誤消息指出

Cannot convert from ArrayList<Hashtable> to ArrayList<Hashtable<String,String>>. 

時,在下面的線,爪哇似乎非常有能力的,它只是告訴我,當我用它不能做同樣的事情

Hashtable<String,String> h = a.get(0); 

在我看來, Java對我說謊。當然,我們不是故意的,我們喜歡對方。但是必須有一個原因。這就是我想要發現的。

+1

請你告訴我哪次課程的'connection'對象是什麼? – Chris 2011-03-15 15:12:08

+0

這是從我們的數據抽象層一類,它實現與敏感返回類型的全選(),selectRow()和selectColumn()方法(ArrayList的,哈希表和ArrayList,分別地)。 – 0xCAFEBABE 2011-03-15 15:19:49

回答

0

這裏有很多問題/缺點。

  1. 散列表是同步的。除非真的需要有一個同步映射,否則不推薦使用散列表。您可以改爲使用Collections.synchronizedMap

  2. 您的實體模型是錯誤的。 Map數據結構不應該用於這些操作。相反,您應該爲每個表創建一個實體。如果表是關於員工的,則創建一個名爲Employee的類,其中具有映射到數據庫中的列的不同屬性。

  3. connection.select*方法似乎沒有通用化,這意味着您不能只在方法調用的左側使用泛型。

  4. 總之,創建對象實例的類別如此不對。

+0

Tahnk你。我很清楚這種數據抽象方法的問題。這不是我的,我只是在它能夠解決問題時才能解決問題,直到我們可以用真正的解決方案取而代之。 – 0xCAFEBABE 2011-03-15 15:18:04

+0

好的:)在這種情況下,我恐怕沒有太大的靈活性。 – adarshr 2011-03-15 15:19:35

1

connection.selectAll()返回類型爲ArrayList<Hashtable>。這就是左邊的情況。

正因爲如此,當你說

ArrayList<Hashtable> a = connection.selectAll("select * from table where id > 5"); 
Hashtable<String,String> h = a.get(0); 

你得到一個警告。 a.get(0)返回一個Hashtable(非通用),你就其分配給Hashtable<String,String>

0

作爲一個臨時的解決方案,我想你實際上可以輸入你的班級像

public class yourConnectionClass<E> 

在類中,你可以改變你的方法Returntyoe:

public <E> HashMap<E,E> selectAll() 

,如果你現在創建的對象你的班級是這樣的:

connection = new yourConnectionClass<String>(); 

我認爲這應該起作用,以便方法的返回類型現在應該Hashmap<String,String>

我真的希望幫助。