Java干扰与Generic类及其实现

use*_*587 0 java generics interface

我有一个名为ReportWriter的接口,它将报告写入OutputStream,Report类包含reportRow列表,也是一个抽象类:

public interface ReportWriter<T extends ReportRow> {
    OutputStream writeReport(Report<T> report) throws ReportWriterException;
}

public abstract class Report<T extends ReportRow> {
   private List<T> rows = Lists.newArrayList();
   ...
}

public abstract class ReportRow {...}
Run Code Online (Sandbox Code Playgroud)

现在我有CsvWriter实现ReportWriter,

public class CsvWriter<T extends ReportRow> implements ReportWriter {
        @Override
        public ByteArrayOutputStream writeReport(Report report) throws ReportWriterException {
        ...
         for (T row : report.getRows()) {  <-- incompatible type
               ..write here..
         }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,它抱怨不兼容的类型:

require Object found T. 
Run Code Online (Sandbox Code Playgroud)

我不理解在Report类中我已经指定T是ReportRow的子类,为什么我抱怨这个?

然后我尝试更新CsvWriter的writeReport,如下所示:

public class CsvWriter<T extends ReportRow> implements ReportWriter {
   @Override
   public ByteArrayOutputStream writeReport(Report<T> report) throws ReportWriterException {  <--- complain here
...
}
Run Code Online (Sandbox Code Playgroud)

现在抱怨:

writeReport(Report<T> report) clashes with writeReport(Report report); both methods have same erasure.
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?谢谢

Dar*_*oid 6

您需要使用泛型类型指定要实现的接口:

public class CsvWriter<T extends ReportRow> implements ReportWriter<T> {
Run Code Online (Sandbox Code Playgroud)

(注意ReportWriter<T>)