2012-10-08 42 views
-1
class example{ 
    private int x=1; 
    public int xreturned(){ 
    return x; 
    } 
} 
class example2<N>{ 
    example2<N> variable; 
    public int fun(){ 
     int x=variable.xreturned(); 
    } 
} 
class mainclass{ 
    public static void main(String[] args){ 
     example2<example>obj=new example2<example>(); 
     if(1.equals(obj.fun())) 
     System.out.println("correct"); 
     return 0; 
    } 
} 

在有趣的功能變量的例題類找不到類實例的xreturned()函數,我怎麼可以讓它找到它?現在你可能會問我該如何找到它?我認爲有可能找到它作爲OBJ有例子(類型的例子類)泛型..所以請告訴我如何使它找到它與最小的變化無法從它的類訪問通用的變量在Java中

+2

某些命名約定如何?例如,類名稱應該以大寫字母開頭,如果你想遵循約定...... –

+0

......並且很少有類包含它們自己的實例,因爲'example2'在這裏執行,它也不會初始化它的變量'成員變量。 –

+0

這不會因其他原因編譯,從main(它是void)和1.equals返回0。還要對System.out.println進行縮進以明確它是if的一部分 –

回答

4

在運行時沒有辦法確定什麼類由於type erasure而提供。在你的情況下,它看起來像N值將始終是類型的實例,讓你的類定義可能是

class Example2<N extends Example> 

這將使你的榜樣工作,但我懷疑它可能是過度簡化,以突出顯示一個點(或家庭作業)。

+2

另外,Example2類中字段的類型應該是'N',而不是'Example2 ' – Anna

+0

你說的是正確的類型擦除,但沒有,它不會使這個例子工作。 –

1

除了大衛的回答,和安娜的評論,這裏是完整的代碼(測試)

注意,我不得不做一些其他的變化使它編譯(請參閱使用說明評論)

class Example{ 
    private int x=1; 
    public int xreturned(){ 
    return x; 
    } 
} 
class Example2<N extends Example> { //as in David's answer 
    N variable; //as in Anna's comment 
    public int fun(){ 
     int x=variable.xreturned(); 
     return x; 
    } 
} 
class Mainclass{ 
    public static void main(String[] args){ 
     Example2<Example>obj=new Example2<Example>(); 
     if(1 == obj.fun()) // 1 doesn't have an equals method 
      System.out.println("correct"); //indentation added, it's a condition 

     //return 0; <-- you can't return 0 from main, it's return type is void 
    } 
} 
+0

您還需要提供示例的實例,否則您將獲得NPE。 –

+0

@DavidHutchison你是絕對正確的,甚至沒有去那裏,只是想讓它編譯至少 –