2017-03-29 5 views
-2

機能していないが、私は、戻り値以下この一般的な戻り値は、私がここで私はクラスのインスタンスを渡しています一般的な機能から、汎用の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 
} 

errorlineはハンドラはタイプされたDefaultHandlerであるため、それは、このメソッドを呼び出すことができます

どのようにされたDefaultHandlerの子クラスであるgetRSSItemList()関数を呼び出すことはできませんと言います?

階層はこのようなものです:アドバンス

+0

は、あなただけのメソッドのパラメータに ''たDefaultHandlerを渡すことはできません。

は、だから、このような方法を持っているクラスを渡す必要があります?それはすべての子クラスを受け入れ、getRSSItemListメソッドを呼び出すことができるでしょうか? –

+0

あなたはgetRSSItemList()メソッドを使用していますか? – Amol

+0

はい、入力ミスがあります。 –

答えて

0

あなたの一般的な方法があるかたDefaultHandlerを拡張するすべてのクラスを受け入れます。したがって、クラスにgetRSSItemListメソッドがあるという保証はありません。あなたがDefaultHandlerを拡張し、そのようなメソッドを定義する2つのクラスを持っているだけでは、コンパイラにとっては不十分です。

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(); 
} 
+0

それは魅力的な働きをしています。今私はそれを理解する必要があります:) – Amol

+0

このretinaburning署名について言及する価値は、単純にハンドラのインスタンス化とアイテムからの取り出しを分けることによって簡単に回避できます。 – pvg

+0

@pvg私は完全にあなたを得ていませんでした – Amol

-1

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

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

おかげでTに(すなわちreturn ((T)handler).getRSSItemList();)をhandlerをキャストしてみ

+0

彼は実際に最初の場所でMのリストが必要です。 – GhostCat

関連する問題