關於傳入null值的問題 |
尚未結案
|
warke
一般會員 發表:19 回覆:32 積分:10 註冊:2004-09-04 發送簡訊給我 |
底下兩段程式碼阿~~
小弟執行後的結果如下:
class t1{} class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} static void m(t1 x) {System.out.print("t1");} public static void main (String[] arg) { m(null); } } 輸出結果: E:\web\JavaTest>javac t.java t.java:9: reference to m is ambiguous, both method m(java.lang.String) in t and method m(t1) in t match m(null); ^ 1 error class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} public static void main (String[] arg) { m(null); } } 輸出結果: E:\web\JavaTest>javac t.java E:\web\JavaTest>java t String E:\web\JavaTest>這邊小弟有一個問題,很明顯的下面那一段程式可以執行是因為把t1這個class取消掉了。 然後小弟的問題是,如果真的要讓程式可以執行到 static void m(t1 x) {System.out.print("t1");} 這一行的話。 那麼第一段程式碼應該要怎麼改呢? 還是說,根本不可能這樣做呢? 另外,小弟測試這樣的結果卻又可以~~ class t1{} class t2 extends t1{} class t { static void m(t1 x) {System.out.print("t1");} static void m(t2 x) {System.out.print("t2");} public static void main (String[] arg) { m(null); } } 執行結果: E:\web\JavaTest>javac t.java E:\web\JavaTest>java t t2 E:\web\JavaTest>實在是奇怪的緊阿>"<~~ 煩請各位大大幫小弟解惑一下 發表人 - warke 於 2004/11/29 23:41:50 |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
|
warke
一般會員 發表:19 回覆:32 積分:10 註冊:2004-09-04 發送簡訊給我 |
allenchan 大大:
感謝您的回應。不過這樣的畫,好像是強迫所有的x都必須轉成t1的格式底下去run是不是呢?
可否稍微講解一下讓小第可以更明白呢?
小弟測試了一下,如果是這樣做的畫,這樣:
class t1{} class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} static void m(t1 x) {System.out.print("t1");} public static void main (String[] arg) { m((ti)5); } }是不行的。 不過 class t1{} class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} static void m(t1 x) {System.out.print("t1");} public static void main (String[] arg) { m(5); } } [print] % javac t.java % java t Object % [/print]和 class t1{} class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} static void m(t1 x) {System.out.print("t1");} public static void main (String[] arg) { m("5"); } } [print] % javac t.java % java t String % [/print]都是可以的咧。 這是因為在(t1)x中的時候,他已經強制轉換成t1裡的格式的關係嗎? |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
E:\web\JavaTest>javac t.java
t.java:9: reference to m is ambiguous, both method m(java.lang.String) in t and
method m(t1) in t match m(null); 這是你第一段程式的錯誤訊息,它跟你說明了當你呼叫 m(null) 的時候,你的
method m(java.lang.String) 跟 method m(t1) 的參數都符合,它不知道該為
你呼叫哪一個,所以你該明確的跟他說,我要呼叫的是 t1 or String。 你可以
m((t1)null) or m((String)t1) 或是 String a1 = null;
t1 a2 = null;
m(a1) or m(a2); 發表人 - allenchan 於 2004/11/30 09:42:31
|
warke
一般會員 發表:19 回覆:32 積分:10 註冊:2004-09-04 發送簡訊給我 |
那請問大大,在第二段程式裡面
class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} public static void main (String[] arg) { m(null); } } 輸出結果: E:\web\JavaTest>javac t.java E:\web\JavaTest>java t String E:\web\JavaTest>我所傳入的null不是也可以對應到String或是Object兩樣嗎? 為什麼這樣子卻又可以呢? |
allenchan
資深會員 發表:10 回覆:306 積分:283 註冊:2004-01-06 發送簡訊給我 |
引言: 那請問大大,在第二段程式裡面您好,建議您看一下書本上關於 overload 以及隱式(implicit)轉換相關的章節,可能會有比較深層的認識。class t { static void m(Object x) {System.out.print("Object");} static void m(String x) {System.out.print("String");} public static void main (String[] arg) { m(null); } } 輸出結果: E:\web\JavaTest>javac t.java E:\web\JavaTest>java t String E:\web\JavaTest>我所傳入的null不是也可以對應到String或是Object兩樣嗎? 為什麼這樣子卻又可以呢? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |