Java 此通用返回值无效

Java 此通用返回值无效,java,generics,Java,Generics,我试图从传递类实例的泛型函数返回泛型ArrayList,但在返回值的类型转换中出现错误 代码如下: public <T extends DefaultHandler> List<M> getItems(Class<T> handlerClass) throws Exception{ SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); SAXParser saxP

我试图从传递类实例的泛型函数返回泛型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 
} 
public List getItems(类handlerClass)引发异常{
SAXParserFactory SAXParserFactory=SAXParserFactory.newInstance();
SAXParser SAXParser=saxParserFactory.newSAXParser();
DefaultHandler=null;
handler=handlerClass.newInstance();
saxParser.parse(“https://www.scoopwhoop.com/rss/category/news“,处理程序);
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;
   }
}
类RSSHandler1扩展了DefaultHandler
{
公共列表getRSSItemList(){
返回rssItemList;
}
}
类RSSHandler2扩展了DefaultHandler
{
公共列表getRSSItemList(){
返回rssItemList;
}
}

提前感谢

尝试将
处理程序
强制转换为
T
(即
返回((T)处理程序).getRSSItemList();

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

因此,您需要传递一个具有此类方法的类:

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

class RSSHandler1 extends DefaultHandler implements RSSLister<RssItem1> {
    public List<RssItem1> getRSSItemList(){
        return rssItemList;
    }
}
公共接口RSSLister{
列出getRSSItemList();
}
类RSSHandler1扩展了DefaultHandler,实现了RSSLister{
公共列表getRSSItemList(){
返回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();
} 
public List getItems(类handlerClass)引发异常{
SAXParserFactory SAXParserFactory=SAXParserFactory.newInstance();
SAXParser SAXParser=saxParserFactory.newSAXParser();
T handler=handlerClass.newInstance();
saxParser.parse(“https://www.scoopwhoop.com/rss/category/news“,处理程序);
return handler.getRSSItemList();
} 

您不能在方法参数中传递
DefaultHandler
?它将接受所有子类,您将能够调用getRSSItemList方法?您说的getRSSItemList()方法?是的,很抱歉输入错误如果您确定它是一个rsshandler,为什么不为rsshandler创建一个超类并将rsshandler作为参数?这样的代码毫无意义,您希望在没有方法的类型的实例上调用方法。这似乎与泛型完全无关。我同意,这段代码完全令人困惑。例如,通用M来自哪里。退一步,创造一个真正的“请”。他实际上首先需要一个M的列表。它就像一个符咒,现在我需要理解:)值得一提的是,通过简单地分离处理程序的实例化和从中检索项目,这个重定时烧录签名是可以避免的。@pvg我没有理解你completely@Amol这个方法做两件不相关的事情——实例化一个新的处理程序和从处理程序获取内容。把它们分开,你就不需要一个普通签名的噩梦了。事实上,整个事情看起来根本不需要泛型,你只需要一些共同的祖先或者RSSHandler和RSSItem。整个过程比需要的复杂17倍,没有明显的回报。是的,这很复杂,但我们不能为RSSItem创建共同的祖先,因为列表不是列表的子类型,我可能在这里完全错了