gpt4 book ai didi

java - java泛型中的继承方法

转载 作者:行者123 更新时间:2023-11-30 08:20:40 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com