1. 程式人生 > 其它 >HashMap類values函式使用時可能遇到的問題及其解決方案

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

Valuescannotbecasttoclassjava.util.ArrayList(java.util.HashMapValues and java.util.ArrayList are in module java.base of loader ‘bootstrap’)
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值的列表。