此通用返回值无效

时间:2017-03-29 06:12:42

标签: java generics

我正在尝试从一个泛型函数返回一个通用的ArrayList,我在这个函数中传递一个类实例但是我在返回值的类型转换中遇到错误

下面是代码:

public <T extends DefaultHandler> List<M> getItems(Class<T> handlerClass) throws Exception{
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    SAXParser saxParser = saxParserFactory.newSAXParser();
    DefaultHandler handler = null;
    handler=handlerClass.newInstance();
    saxParser.parse("https://www.scoopwhoop.com/rss/category/news", handler);
    return handler.getRSSItemList();  // errorLine 
} 

错误线表示,因为处理程序的类型为DefaultHandler,它不能调用在DefaultHandler的子类中的getRSSItemList()函数

如何调用此方法?

层次结构如下:

Class RSSHandler1 extends DefaultHandler
{
  public List<RssItem1> getRSSItemList(){
    return rssItemList;
  }
}

Class RSSHandler2 extends DefaultHandler
{
   public List<RssItem2> getRSSItemList(){
    return rssItemList;
   }
}

先谢谢

2 个答案:

答案 0 :(得分:0)

您的泛型方法接受任何属于或扩展DefaultHandler的类。因此无法保证类中有getRSSItemList方法。仅仅因为你有两个扩展DefaultHandler的类并且定义这样的方法对编译器来说是不够的。

所以你需要传递一个有这种方法的类:

public interface RSSLister<I> {
    List<I> getRSSItemList();
}

class RSSHandler1 extends DefaultHandler implements RSSLister<RssItem1> {
    public List<RssItem1> getRSSItemList(){
        return rssItemList;
    }
}

你的方法应该是

public <I, T extends DefaultHandler & RSSLister<I>> List<I> getItems(Class<T> handlerClass) throws Exception {
    SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
    SAXParser saxParser = saxParserFactory.newSAXParser();
    T handler = handlerClass.newInstance();
    saxParser.parse("https://www.scoopwhoop.com/rss/category/news", handler);
    return handler.getRSSItemList();
} 

答案 1 :(得分:-1)

尝试将handler投射到T(即return ((T)handler).getRSSItemList();