概要
Javac編譯時(shí),只允許target的版本高于source的版本趾牧,因?yàn)橹挥懈甙姹静趴赡芗嫒莸桶姹荆蚴?- 反證法 - 如果我的java代碼里用到了java8的lambda表達(dá)式,那么我編譯的時(shí)候告訴javac源代碼用1.8的語法進(jìn)行解釋橡淑,目標(biāo)字節(jié)碼用1.4的來表示哼蛆,但1.4的java里根本沒有辦法表達(dá)lambda蕊梧,所以是行不通的。因此代碼只能按照低版本的java語法進(jìn)行編譯腮介,然后生成高版本的字節(jié)碼肥矢;
實(shí)踐
用HelloWorld來測試,拒絕編譯的 -
C:\>javac-source 1.8 -target 1.4 E:\eclipse\workspace\Java8\src\HelloWorld.java
javac: source release 1.8 requires target release 1.8
Eclipse在target低于source java時(shí)也會有類似的提示 -‘Classfile compatibility must be equal or greater than source compatibility.’
如下是可以編譯的叠洗,盡管有warning -
C:\>javac-source 1.4 -target 1.8E:\eclipse\workspace\Java8\src\HelloWorld.java
warning: [options] bootstrap class path not set in conjunction with -source 1.4
warning: [options] source value 1.4 is obsolete and will be removed in a future release
warning: [options] To suppress warnings about obsolete options, use -Xlint:-options.3 warnings
實(shí)踐和問題
結(jié)合到實(shí)際工作中 - legacy的代碼是1.4編寫的甘改,我們不想改動代碼旅东,為了提高性能, 直接把1.4的字節(jié)碼運(yùn)行在1.7的JVM上十艾;其實(shí)可以通過source 1.4抵代,target 1.7來生成高版本的字節(jié)碼,然后運(yùn)行在1.7的JVM上疟羹。既然1.4和1.7的字節(jié)碼都能運(yùn)行在1.7的JVM上主守,那么高版本的字節(jié)碼到底比低版本有什么好處呢?