2013-08-22 80 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实际上包含字符串数据。