为什么我在这行中得到编译错误String s = data.get(idx);
更新:我类型不匹配:无法从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 :(得分: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>
延伸。但是,更重要的是要了解它为什么不起作用,以便您可以选择正确的方法来解决问题。
答案 1 :(得分:1)
你走了。
data.get(idx).toString();
答案 2 :(得分:1)
该行应为:
E s = data.get(idx);
然后,如果你想打印它,你可以这样做:
System.out.println(s.toString());
答案 3 :(得分: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()
,因此它同样是异常安全的。
答案 4 :(得分:0)
您收到编译错误的原因是因为在Child
类中,您调用的地方data.get(idx)
它不知道它将是一个字符串。
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);
}
答案 5 :(得分:0)
您可以解决问题,将其转换为字符串或在通用参数中使用字符串
String s = data.get(idx);
ArrayList<String> data=new ArrayList<String>();
您收到此错误的原因是因为您使用的是Generic方法和类型参数 因此,当您将通用列表中的值分配给字符串时,您会收到错误。编译器不知道您的List实际上包含字符串数据。