Java泛型列表编译错误

时间:2013-08-22 03:34:07

标签: java generics

为什么我在这行中得到编译错误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);
}
}

6 个答案:

答案 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实际上包含字符串数据。

相关问题