java - java泛型中的继承方法

标签 java generics

我不确定在覆盖子类中的方法时泛型如何工作。

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/

相关文章:

c# - 无法在列表 C# 中保存通用接口(interface)实现

Java 设置为无效目录

java - 在 neo4j 中制作任意标识符

java - 为什么@Valid会导致可重入刷新?

java - 从源代码构建 netty 时出现问题

c# - 通用接口(interface)中的协变

python - 通用 View 'archive_year' 产生空白页

java - 生成唯一的引用号

Kotlin 中的 Java 泛型 : Use Java raw type as method parameter in Kotlin

c# - 使用反射实例化泛型类