JAVA兼容低版本JDK的正確編譯方式

雖然使用高版本的JDK能夠經過指定編譯source和target參數來兼容低版本JDK,但只是class文件格式上的,若是引用了高版本JRE庫中某些方法同樣會再低版本的JDK上報錯;典型的例子就是java.util.concurrent.ConcurrentHashMap.keySet()這個方法!java

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

public class T {

	public static void main(String[] args) {
		ConcurrentHashMap<String, String> map = new ConcurrentHashMap<String, String>();
		map.put("hello", "");
		Iterator<String> it = map.keySet().iterator();
		System.out.println(it.next());
		
	}

}

用jdk1.8編譯 /jdk1.8/bin/javac -source 1.7 -target 1.7 T.javacode

用jdk1.7執行 /jdk1.7/bin/java Tget

會報異常 java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetViewit

解決的辦法是,編譯使用對應的JDK,確保JRE的類庫是對應版本。不然在乎想不到的地方出現坑!編譯

參考:http://stackoverflow.com/a/25705596class

相關文章
相關標籤/搜索