主(數據)類型能從一個
較小
的類型自動轉變成一個
較大
的類型
涉及過載問題時
這會稍微造成一些混亂
下面這個例子揭示了將主類型傳遞給過載的方法時發生的情況
//: PrimitiveOverloading
java
// Promotion of primitives and overloading
public class PrimitiveOverloading {
// boolean can
t be automatically converted
static void prt(String s) {
System
out
println(s);
}
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(double x) { prt(
f
(double)
); }
void testConstVal() {
prt(
Testing with
);
f
(
);f
(
);f
(
);f
(
);f
(
);f
(
);f
(
);
}
void testChar() {
char x =
x
;
prt(
char argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
void testByte() {
byte x =
;
prt(
byte argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
void testShort() {
short x =
;
prt(
short argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
void testInt() {
int x =
;
prt(
int argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
void testLong() {
long x =
;
prt(
long argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
void testFloat() {
float x =
;
prt(
float argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
void testDouble() {
double x =
;
prt(
double argument:
);
f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);f
(x);
}
public static void main(String[] args) {
PrimitiveOverloading p =
new PrimitiveOverloading();
p
testConstVal();
p
testChar();
p
testByte();
p
testShort();
p
testInt();
p
testLong();
p
testFloat();
p
testDouble();
}
} ///:~
若觀察這個程序的輸出
就會發現常數值
被當作一個int值處理
所以假若可以使用一個過載的方法
就能獲取它使用的int值
在其他所有情況下
若我們的數據類型
小於
方法中使用的自變量
就會對那種數據類型進行
轉型
處理
char獲得的效果稍有些不同
這是由於假期它沒有發現一個准確的char匹配
就會轉型為int
若我們的自變量
大於
過載方法期望的自變量
這時又會出現什麼情況呢?對前述程序的一個修改揭示出了答案
//: Demotion
java
// Demotion of primitives and overloading
public class Demotion {
static void prt(String s) {
System
out
println(s);
}
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(double x) { prt(
f
(double)
); }
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(float x) { prt(
f
(float)
); }
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(long x) { prt(
f
(long)
); }
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(int x) { prt(
f
(int)
); }
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(short x) { prt(
f
(short)
); }
void f
(char x) { prt(
f
(char)
); }
void f
(byte x) { prt(
f
(byte)
); }
void f
(char x) { prt(
f
(char)
); }
void testDouble() {
double x =
;
prt(
double argument:
);
f
(x);f
((float)x);f
((long)x);f
((int)x);
f
((short)x);f
((byte)x);f
((char)x);
}
public static void main(String[] args) {
Demotion p = new Demotion();
p
testDouble();
}
} ///:~
在這裡
方法采用了容量更小
范圍更窄的主類型值
若我們的自變量范圍比它寬
就必須用括號中的類型名將其轉為適當的類型
如果不這樣做
編譯器會報告出錯
大家可注意到這是一種
縮小轉換
也就是說
在造型或轉型過程中可能丟失一些信息
這正是編譯器強迫我們明確定義的原因——我們需明確表達想要轉型的願望
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25527.html