ConcurrentHashMap的keySet()的兼容問題


這兩天遇到一個問題,我用JDK 8編譯出來的程序在JRE 6上運行報ClassNotFoundException,說找不到java.util.concurrent.ConcurrentHashMap$KeySetView這個類。

原來Java 7或以下版本中是沒有java.util.concurrent.ConcurrentHashMap$KeySetView這個類的。在Java 8中,ConcurrentHashMap中才新增了KeySetView這個public的內部類,而ConcurrentHashMap的keySet方法的返回值也改成了KeySetView。這樣,對於以下代碼:

ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<String, Object>();
for (String key : map.keySet()) {
    // do something
}

解開for-in的語法糖,JDK 8實際上會把代碼看成以下的樣子:

ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<String, Object>();
ConcurrentHashMap.KeySetView<String, Object> temp1 = map.keySet();
for (Iterator<String> iterator = temp1.iterator(); iterator.hasNext(); ) {
    String key = iterator.next();
    // do something
}

因此,在JRE 6上執行的時候,就會找不到java.util.concurrent.ConcurrentHashMap$KeySetView這個類。

解決方法是在定義map變量的時候,用Map接口來定義,即

Map<String, Object> map = new ConcurrentHashMap<String, Object>();
for (String key : map.keySet()) {
    // do something
}

通過這個問題,我們可以看到,在定義變量的時候用接口來定義而不是用實現類來定義,在實現類的具體實現變化的時候能避免產生一些兼容性的問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM