使用泛型时不兼容的类型

时间:2014-07-30 15:58:57

标签: java generics

我有一个看起来像这样的课程:

public class TrafficReportMapper implements RowMapper<TrafficReport> {

   @Override
   public TrafficReport mapRow(ResultSet rs, int rowNum) {
     // Do something here
     return new TrafficReport(....);
   }
}

TrafficReport是一个POJO,我想用DayTrafficReport之类的东西扩展它,并创建一个扩展TrafficReportMapper的新映射器。所以我更改了TrafficReportMapper如下:

public class TrafficReportMapper<T extends TrafficReport> implements RowMapper<T> {

   @Override
   public T mapRow(ResultSet rs, int rowNum) {
     // Exactly the same code as before
     return new TrafficReport(....);
   }
}

只有这次我

  

不兼容的类型:必需的T;发现TrafficReport

但问题是TrafficReport必须是T类型。我不确定我在这里缺少什么。

2 个答案:

答案 0 :(得分:2)

您可以按如下方式声明class

public class TrafficReportMapper<T extends TrafficReport> implements RowMapper<TrafficReport> 

...假设:

interface RowMapper<T>  {
    public T mapRow(ResultSet rs, int rowNum);
    ...
}

然后,如果你有:

class TrafficReport{}

...和...

class DayTrafficReport extends TrafficReport{}

您可以这样初始化:

TrafficReportMapper<DayTrafficReport> trm = new TrafficReportMapper<DayTrafficReport>();

答案 1 :(得分:2)

如果您创建TrafficReportMapper<DayTrafficReport>,您的方法将变为:

@Override
public DayTrafficReport mapRow(ResultSet rs, int rowNum) {
    return new TrafficReport(....);
}

(不是因为仿制品被删除了,但它是一个很好的思考方式。)

TrafficReport 不是 DayTrafficReport的子类型,因此您无法像这样返回它。