2013-08-22 103 views
0

爲什麼我在這一行中得到一個編譯錯誤String s = data.get(idx);Java泛型列表編譯錯誤

更新:我得到類型不匹配:不能給E轉換爲字符串

public class Parent<E> { 
     ArrayList<E> data=new ArrayList<E>(); 

     public void add(E d){ 
      data.add(d); 
     } 
     public List<E> getData(){ 
      return data; 
     } 
    } 

    public class Child<E> extends Parent<E>{ 

     public void appendData(E newItem){ 
      super.add(newItem); 
     } 
     public void displayData(int idx){ 
      List<E> data=this.getData(); 
      **String s=data.get(idx);**//I get compilation error in this line 
      System.out.println(s); 
     } 

     public static void main(String[] args) { 
      Child<String> c=new Child<String>(); 
      c.appendData("Data1"); 
      c.appendData("Data2"); 

      c.displayData(1); 
     } 
    } 

解決方案更新的類:

public class Child<S> extends Parent<String>{ 

public void appendData(String newItem){ 
    super.add(newItem); 
} 
public void displayData(int idx){ 
    List<String> data=this.getData(); 
    String s=data.get(idx); 
    System.out.println(s); 
} 

public static void main(String[] args) { 
    Child c=new Child(); 
    c.appendData("Data1"); 
    c.appendData("Data2"); 

    c.displayData(1); 
} 
} 
+0

你得到的錯誤是什麼?我假設你想''toString()'這裏'data.get(idx);'。 –

+0

您必須像這樣投射:String s =(String)data.get(idx)否則您必須使用列表而不是列表數據 – Amith

+0

泛型負責類型轉換的權利? – james007

回答

3

它不應該是什麼難以理解:

String s=data.get(idx);data是類型ArrayList<E>。鑑於您在E中沒有特別限制,可能是任何不是字符串的類型。試想一下,如果您使用的是Child<Date>,那麼data實際上是ArrayList<Date>,String s = data.get(i)根本沒有意義。

因此,編譯器向您抱怨,您不能簡單地假設data.get(index)的結果是一個字符串。

解決問題的方法非常簡單。例如,你可以做任何建議在其他人的答案。這也可能是你的設計問題,你的Child不應該承受類型參數,它應該從Parent<String>延伸。然而,更重要的是你明白了爲什麼它不起作用,所以你可以選擇正確的方法來解決你的問題。

+0

+1解釋爲什麼它不會編譯的原因... – edwardsmatt

+0

更新classpublic類兒童擴展父 { \t公共無效appendData(字符串的newitem){ \t \t超。添加(的newitem); \t} \t公共無效displayData(INT IDX){ \t \t列表數據= this.getData(); \t \t String s = data.get(idx); \t \t System.out.println(s); \t} \t \t 公共靜態無效的主要(字串[] args){ \t \t兒童C =新的兒童(); \t \t c.appendData(「Data1」); \t \t c.appendData(「Data2」); \t \t \t \t c.displayData(1); \t} } – james007

1

在這裏你去。

data.get(idx).toString(); 
1

這行應爲:

E s = data.get(idx); 

然後,如果你想打印出來,你可以做這樣的:

System.out.println(s.toString()); 
0

這是不是真的與generics。但是,爲了回答這個問題,

String s=data.get(idx); 

String s= String.valueOf(data.get(idx)); 

如果你是絕對相信data.get(idx)將永遠不會返回null被替換,你也可以使用:

String s= data.get(idx).toString() ; 

否則,您將收到NullPointerException s。

在第二次讀,你也可以使用

System.out.println(data.get(idx)) ; 

直接。在內部,這使用String.valueOf(),所以它同樣是異常安全的。

0

之所以會出現編譯錯誤的原因是因爲在Child類中,您調用的是data.get(idx)它並不知道它將成爲String。

public void displayData(int idx) { 
    List<E> data = this.getData(); 
    //String s=data.get(idx); //Doesn't compile because it won't know this is a String at runtime 
    E s = data.get(idx); // To make it generic to the type in main, change the type to E 
    System.out.println(s); 
} 
0

你能解決這個問題,要麼強制轉換爲字符串或使用字符串中的泛型參數

String s = data.get(idx); 
ArrayList<String> data=new ArrayList<String>(); 

你是因爲你使用泛型方法和類型參數收到此錯誤 所以,當你的原因正在將您的通用列表中的值分配給您遇到錯誤的字符串。編譯器不知道你的List實際上包含字符串數據。