0

为什么我在这一行出现编译错误 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);
}
}
4

6 回答 6

3

应该不难理解:

String s=data.get(idx);中,data属于 的类型ArrayList<E>。鉴于您在 中没有特殊限制E,因此可以是任何不是字符串的类型。试想一下,如果您使用 a 会发生什么Child<Date>,而data实际上 aArrayList<Date>String s = data.get(i)没有意义的。

因此,编译器向您抱怨您不能简单地假设结果data.get(index)是一个字符串。

修复的方法可以是直截了当的。例如,您可以执行其他人回答中建议的任何操作。这也可能是您设计的一个问题,您Child不应该承担类型参数,它应该从Parent<String>. 然而,更重要的是您了解它为什么不起作用,以便您可以选择正确的方法来解决您的问题。

于 2013-08-22T03:53:39.373 回答
1

干得好。

data.get(idx).toString();
于 2013-08-22T03:36:55.293 回答
1

该行应为:

E s = data.get(idx);

然后如果你想打印它,你可以这样做:

System.out.println(s.toString());
于 2013-08-22T03:37:18.293 回答
0

这与generics. 但要回答这个问题,

String s=data.get(idx);

应该替换为

String s= String.valueOf( data.get(idx) );

如果您绝对确定data.get(idx)永远不会返回null,您还可以使用:

String s= data.get(idx).toString() ;

否则,您将收到NullPointerExceptions。

在第二次阅读时,您还可以使用

System.out.println( data.get(idx) ) ;

直接地。在内部,这使用String.valueOf()它同样是异常安全的。

于 2013-08-22T03:45:40.963 回答
0

您可以将其转换为字符串或在通用参数中使用字符串来解决问题

String s = data.get(idx);
ArrayList<String> data=new ArrayList<String>();

您收到此错误的原因是因为您使用的是通用方法和类型参数所以当您将通用列表中的值分配给字符串时,您会遇到错误。编译器不知道您的 List 实际上包含字符串数据。

于 2013-08-22T04:33:43.790 回答
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);
}
于 2013-08-22T03:55:17.190 回答