Java泛型中的继承方法

用户名

我不确定重写子类中的方法时泛型如何工作。

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 

我该如何解决?

维文·帕利亚斯(Vivin Paliath)

通常,在扩展通用类时,还需要在扩展类的签名中指定通用类型:

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>因此,如果有人实例化了的实例CSVReaderCSVReader<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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章