[英]Java Generics List Compilation error
为什么我在这一行中遇到编译错误String s = data.get(idx);
更新:我得到类型不匹配:无法从E转换为String
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);
}
}
应该不难理解:
在String s=data.get(idx);
, data
为ArrayList<E>
类型。 如果您对E
没有特殊限制,则可以是非字符串的任何类型。 试想一下,如果您使用的是Child<Date>
,那么该data
实际上是ArrayList<Date>
,那么String s = data.get(i)
根本就没有意义。
因此,编译器向您抱怨说,您不能简单地假设data.get(index)
的结果为String。
修复方法可能很简单。 例如,您可以做其他人的回答中建议的任何事情。 您的Child
也不应带有类型参数,而应该从Parent<String>
扩展它,这可能也是您设计的问题。 但是,更重要的是要了解为什么它不起作用,以便您选择正确的方法来解决问题。
干得好。
data.get(idx).toString();
该行应显示为:
E s = data.get(idx);
然后,如果要打印它,可以按照以下步骤进行:
System.out.println(s.toString());
这实际上与generics
无关。 但是要回答这个问题,
String s=data.get(idx);
应该替换为
String s= String.valueOf( data.get(idx) );
如果您完全确定data.get(idx)
绝不会返回null
,则还可以使用:
String s= data.get(idx).toString() ;
否则,您将收到NullPointerException
。
一读,您还可以使用
System.out.println( data.get(idx) ) ;
直。 在内部,它使用String.valueOf()
因此它同样具有异常安全性。
之所以会得到编译错误,是因为在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);
}
您可以将其转换为字符串或在通用参数中使用字符串来解决问题
String s = data.get(idx);
ArrayList<String> data=new ArrayList<String>();
之所以会出现此错误,是因为您使用的是泛型方法和类型参数,因此,当您将泛型列表中的值分配给字符串时,会出现错误。 编译器不知道您的列表实际上包含字符串数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.