Java泛型列表编译错误
为什么我在这一行中得到一个编译错误字符串s=data.get(idx) 更新:我得到类型不匹配:无法从E转换为字符串Java泛型列表编译错误,java,generics,Java,Generics,为什么我在这一行中得到一个编译错误字符串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> get
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);
}
}
公共类父类{
ArrayList数据=新的ArrayList();
公共空间添加(E和d){
数据.添加(d);
}
公共列表getData(){
返回数据;
}
}
公共类子级扩展父级{
公共数据(E newItem){
super.add(newItem);
}
公共无效显示数据(int idx){
List data=this.getData();
**字符串s=data.get(idx);**//我在此行中得到编译错误
系统输出打印项次;
}
公共静态void main(字符串[]args){
Child c=新的Child();
c、 附录数据(“数据1”);
c、 附录数据(“数据2”);
c、 显示数据(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);
}
}
公共类子级扩展父级{
公共无效数据(字符串newItem){
super.add(newItem);
}
公共无效显示数据(int idx){
List data=this.getData();
字符串s=data.get(idx);
系统输出打印项次;
}
公共静态void main(字符串[]args){
Child c=新的Child();
c、 附录数据(“数据1”);
c、 附录数据(“数据2”);
c、 显示数据(1);
}
}
给你
data.get(idx).toString();
给你
data.get(idx).toString();
该行应改为:
E s = data.get(idx);
然后,如果您想打印它,您可以这样做:
System.out.println(s.toString());
该行应改为:
E s = data.get(idx);
然后,如果您想打印它,您可以这样做:
System.out.println(s.toString());
这实际上与
泛型
无关。但要回答这个问题,
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()
,因此它同样是异常安全的。这实际上与泛型无关。但要回答这个问题,
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()
,因此它同样是异常安全的。这应该不难理解:
在String中,s=data.get(idx)代码>,数据
的类型为数组列表
。如果在E
中没有特殊限制,则可以是非字符串的任何类型。试想一下,如果您使用的是子对象
,而数据实际上是数组列表
,字符串s=data.get(i)
根本没有意义
因此,编译器向您抱怨,您不能简单地假设data.get(index)
的结果是字符串
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)代码>,数据
的类型为数组列表
。如果在E
中没有特殊限制,则可以是非字符串的任何类型。试想一下,如果您使用的是子对象
,而数据实际上是数组列表
,字符串s=data.get(i)
根本没有意义
因此,编译器向您抱怨,您不能简单地假设data.get(index)
的结果是字符串
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);
}
修复的方法可以是直截了当的。例如,你可以根据别人的回答做任何建议。这也可能是您的设计中的一个问题,即您的子项
不应带有类型参数,并且它应该从父项
扩展。但是,更重要的是,您要理解它为什么不起作用,以便选择正确的方法来解决问题。出现编译错误的原因是因为在子类中,您在该类中调用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);
}
publicsvoiddisplaydata(intidx){
List data=this.getData();
//字符串s=data.get(idx);//未编译,因为它在运行时不知道这是一个字符串
es=data.get(idx);//若要使其成为main中的类型的泛型,请将该类型更改为E
系统输出打印项次;
}
出现编译错误的原因是因为在子类中,调用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);
}
publicsvoiddisplaydata(intidx){
List data=this.getData();
//字符串s=data.get(idx);//未编译,因为它在运行时不知道这是一个字符串
es=data.get(idx);//若要使其成为main中的类型的泛型,请将该类型更改为E
系统输出打印项次;
}
您可以将其转换为字符串或在泛型参数中使用字符串来解决此问题
String s = data.get(idx);
ArrayList<String> data=new ArrayList<String>();
String s=data.get(idx);
ArrayList数据=新的ArrayList();
之所以出现此错误,是因为您使用的是泛型方法和类型参数
所以,当您将通用列表中的值分配给字符串时,您会遇到错误。编译器不知道您的列表实际上包含字符串数据。您可以将其转换为字符串或在泛型参数中使用字符串来解决此问题
String s = data.get(idx);
ArrayList<String> data=new ArrayList<String>();
String s=data.get(idx);
应收账