繁体   English   中英

Java泛型列表编译错误

[英]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); dataArrayList<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM