全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1156
推到 Plurk!
推到 Facebook!

關於傳入null值的問題

尚未結案
warke
一般會員


發表:19
回覆:32
積分:10
註冊:2004-09-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-29 23:34:49 IP:211.76.xxx.xxx 未訂閱
底下兩段程式碼阿~~ 小弟執行後的結果如下:
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-30 00:24:21 IP:61.62.xxx.xxx 未訂閱
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((t1)null);
  }
}
warke
一般會員


發表:19
回覆:32
積分:10
註冊:2004-09-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-30 08:00:39 IP:218.170.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-30 09:39:14 IP:61.62.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-30 11:11:54 IP:218.170.xxx.xxx 未訂閱
那請問大大,在第二段程式裡面
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-30 12:51:01 IP:203.70.xxx.xxx 未訂閱
引言: 那請問大大,在第二段程式裡面
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兩樣嗎? 為什麼這樣子卻又可以呢?
您好,建議您看一下書本上關於 overload 以及隱式(implicit)轉換相關的章節,可能會有比較深層的認識。
系統時間:2024-05-08 16:58:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!