我不确定重写子类中的方法时泛型如何工作。
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 {
...
}
}
在您的情况下,如果需要a 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
当您尝试访问列表中的元素时,您将得到一个a 。编译器可能会警告您(我认为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
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句