Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型列表编译错误_Java_Generics - Fatal编程技术网

Java泛型列表编译错误

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

为什么我在这一行中得到一个编译错误字符串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);
        }
    }
公共类父类{
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);
应收账