我不确定在覆盖子类中的方法时泛型如何工作。
import com.fasterxml.sort.DataReader;
public class CSVReader<E> extends DataReader<E>
{
private final ICsvListReader reader;
public CSVReader(InputStream in) {
reader = new CsvListReader(new InputStreamReader(in), CsvPreference.STANDARD_PREFERENCE);
}
@Override
public E readNext() throws IOException {
java.util.List<String> line=reader.read();
return line;//compilation error
}
}
错误
Type mismatch: cannot convert from List<String> to E CSVReader.java
如何解决这个问题?
最佳答案
一般来说,在扩展泛型类时,还需要在扩展类的签名中指定泛型类型:
public class CSVReader<T> extends DataReader<T> {
...
@Override
public T readNext() throws IOException {
...
}
}
就您而言,您想要 List
,您可以更具体地执行以下操作:
public class CSVReader<T extends List<E>> extends DataReader<T> {
...
@Override
public List<E> readNext() throws IOException {
...
}
}
我看了一下 ICsvListReader
并且该类未泛化,这将使您实现 readNext()
有点问题。看来read
总是返回List<String>
。因此,如果有人实例化 CSVReader
的实例即CSVReader<List<Integer>>
那么你就有麻烦了(堆污染),因为 readNext
正在返回List<String>
,然后你最终会得到 ClassCastException
当您尝试访问列表的元素时。编译器可能会警告您(我认为 Java 7 会警告您),但代码实际上会编译,因为泛型类型会在运行时由于类型删除而丢失。因此,在这种情况下,我认为最好是非常明确地这样做:
public class CSVReader extends DataReader<List<String>> {
private final ICsvListReader reader;
...
@Override
public List<String> readNext() throws IOException {
return reader.read(); //read already throws an IOException so you're good to go
}
}
关于java - java泛型中的继承方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25883339/