HashMap類values函式使用時可能遇到的問題及其解決方案
技術標籤:java學習筆記
問題描述:
寫程式碼時希望將一個HashMap中的所有鍵值存入一個集合,於是想到了用value()函式,查詢了API發現該函式的返回值是一個Collection,因此想著用ArrayList接收的話應該要將Collection強制轉化為ArrayList(類似於用(int)浮點數的強制轉換)程式碼如下
ArrayList<String> num = (ArrayList<String>) data.values();
其中data是已有的一個HashMap。
但呼叫函式values()發生了錯誤,錯誤如下
“Exception in thread “main” java.lang.ClassCastException: class java.util.HashMap
V
a
l
u
e
s
c
a
n
n
o
t
b
e
c
a
s
t
t
o
c
l
a
s
s
j
a
v
a
.
u
t
i
l
.
A
r
r
a
y
L
i
s
t
(
j
a
v
a
.
u
t
i
l
.
H
a
s
h
M
a
p
Values cannot be cast to class java.util.ArrayList (java.util.HashMap
at part_3.Test_HashMap.main(Test_HashMap.java:64)”
原因分析:
其實是沒有弄明白java中子類和父類的關係:
在java中,父類引用可以指向子類例項,反過來則不行
舉例說明:
Person類是Student類的父類。
Student s = new Student ();
Person p = (Person)s;//這裡加不加(Person)都不會報錯
這種用父類引用指向子類例項的向上造型是可以的
現在
Person p = new Person();
Student s = (Student)p;
這種直接的向下造型是不被允許的。
值得注意的點是,
Person p = new Student();
Student s = (Student)p;
這是因為p指向的是子類的例項,那麼作為子類Student的引用s自然可以指向Student的例項。這也是向下造型的用法。
解決方案:
所以用強制轉化的方式將Collection這個例項交給子類ArrayList去引用那是行不通的。正確的方式應該為,呼叫ArrayList的一參構造方法
HashSet<String> num = new HashSet<>(data.values());
可以得到一個包含HashMap所有Value值的列表。