2016-02-07 59 views
0

以下類是正確的方式。周圍有4顆星的代碼是下一個(不正確)課程中將會發生的變化。爲什麼我必須使用Object類作爲參考類型才能使此程序起作用?

public class Hello 
{ 
    public void go() 
    { 
     Hello aDog = new Hello(); 
     **Object** sameDog = getObject(aDog); 
     System.out.println(aDog); 
     System.out.println(sameDog); 
    } 

    public Object getObject(Object o) 
    { 
     return o; 
    } 
} 

這是隔壁班

public class Hello 
{ 
    public void go() 
    { 
     Hello aDog = new Hello(); 
     **Hello** sameDog = getObject(aDog); 
     System.out.println(aDog); 
     System.out.println(sameDog); 
    } 

    public Object getObject(Object o) 
    { 
     return o; 
    } 
} 

最後,我有我的測試類。

public class HelloTester { 
    public static void main(String[] args) { 
     Hello a = new Hello(); 
     a.go(); 
    } 
} 

下面的輸出是從正確類:

[email protected] 
[email protected] 

不正確代碼不起作用(顯然)。

這是爲什麼?

+3

因爲你的方法返回一個'Object'。 –

+0

@OliverCharlesworth但是,Hello類是否繼承了Object中的所有內容? –

+1

是的,但這並不意味着你可以做'Object a = new Object();你好b = a;'。 –

回答

0

方法getObject顯式聲明返回java.lang.Object - 這就是爲什麼它的編譯器不會讓你的結果分配給一個更明確的類型的變量,在這種情況下是Dog。沒有任何聲明這種方法的返回類型與參數類型相同 - 它可以是任何Object都可以傳遞,因此返回類型是Object

如果你重寫代碼使用泛型,你可以肯定在編譯時獲得Dog實例:

public <T> T getObject(T object) 
{ 
    return object; 
} 

該聲明由多個部分組成:

  • public - 中方法是公開的。

  • <T>此方法的所有參數在此處聲明。在這種情況下,這是一個不受約束的(例如沒有上限或下限,如T extends List)單個參數 - T

  • T - 此方法的返回類型將是通用類型T

  • getObject - 方法名稱。

  • T object - 一個T類型的參數命名對象。

0

函數getObject()返回一個「Object」類型的對象。 指向具有Hello類型指針的對象類型時,您正在執行隱式上傳,這是不允許的

+0

允許上傳。這是一個下調問題。 –

0

getObject返回一個Object,而您將其指定給一個Hello類型。 你應該「投」是一個Hello對象:

 **Hello** sameDog = (Hello) getObject(aDog); 
相關問題