java類型提升機制比較常見,但是比較隱蔽,特別是自動強轉類型的時候,如果不注意就可能出錯。
涉及基本元素的自動提升類型場景有:
- 不同類型進行四則運算的時候,會自動提升類型到類型最高元素的類型
- += 和 -= 會自動提升類型,然後再強轉回來
- 位運算符比int類型低的會自動提升成int類型
- <<= 和>>= 會轉成int類型再強轉回來
- 三元操作符 ? : 會像四則運算一樣自動提升類型,但是不會把強轉回來
涉及到方法重載時的類型提升
在方法重載的時候,如果參數類型不嚴格匹配,會自動提升參數類型,這個對類對基本類型都是如此,但是涉及到可變參數的時候,可能會出現編譯錯誤:
import java.util.*;
public class Main1{
int i=10;
public static void main(String[] args) {
Main1 s = new Main1();
s.f(1,'a');//編譯正確,匹配第一個f,1提升成1.0去匹配第一個
s.f('a','b');//編譯錯誤,編譯器會提升‘a’到float,出現歧義
}
void f(float i,Character...a){}
void f(Character...a){}
}
java會自動提升類型去匹配可變參數列表,當有多個都能匹配的時候,就不能確定哪一個,從而出現編譯錯誤。