2015-02-13 3 views
1

Я до сих пор довольно новичок как в Java, так и в Android, и я работаю над проектом для Android-ридеров Android. Я пишу читателю, который работает как AsyncTask, и хотел бы сохранить его как можно более удобным для использования. Я использую синтаксический анализатор SAX в читателе и хотел бы, чтобы он принял обработчик любого типа, который расширяет DefaultHandler. Однако, когда я пытаюсь вызвать метод разбора SAXParser, он не понимает параметр обработчика.Использование Generics как параметры

cannot resolve method 'parse(org.xml.sax.InputSource,java.lang.Class<capture<? extends org.xml.sax.helpers.DefaultHandler>>)' 

Является ли это правильный путь идти об этой проблеме с точки зрения прохождения универсального обработчика, или есть что-то я должен делать по-другому?

public class RSSFeeder extends AsyncTask<Void, Void, Void>{ 

private Class<? extends DefaultHandler> handler; 
private String feedURL; 

public RSSFeeder(Class<? extends DefaultHandler> handler, String feedURL) { 
    this.handler = handler; 
    this.feedURL = feedURL; 
} 

@Override 
protected Void doInBackground(Void... params) { 
    URL feedLocation = null; 
    try { 
     feedLocation = new URL(feedURL); 
     BufferedReader in = new BufferedReader(new InputStreamReader(feedLocation.openStream())); 

     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     SAXParser sp = spf.newSAXParser(); 

     sp.parse(new InputSource(in), handler); 

    } catch (MalformedURLException murlex) { 
     Log.d(this.getClass().getName(), "The supplied URL is not valid " + murlex.getMessage()); 
    } catch (IOException iox) { 
     Log.d(this.getClass().getName(), "Could not read data from the supplied URL: " + feedLocation.toString() + " " + iox.getMessage()); 
    } catch (ParserConfigurationException pcex) { 
     Log.d(this.getClass().getName(), "Could not configure new parser. " + pcex.getMessage()); 
    } catch (SAXException saxex) { 
     Log.d(this.getClass().getName(), "Could not create new sax parser. " + saxex.getMessage()); 
    } 

    return null; 
} 
+0

ли продлить ваш обработчик DefaultHandler? –

+0

Я еще не закодировал обработчик, но да, это будет так. Нужно ли мне все штук, чтобы собеседник это понял? – oapeter

+0

Ну, для компиляции вам нужен ваш код для удовлетворения лексических, синтаксических и семантических правил, и правильные типы являются частью этого. @manouti дал несколько советов в своем ответе, поэтому попробуйте. Он выглядит хорошо :) –

ответ

0

handler является переменной типа java.lang.Class, не DefaultHandler (или любой из его подтипов). Второй аргумент для метода SAXParser#parse() должен иметь тип DefaultHandler. Вы можете попробовать объявить свой класс в качестве родового класса с параметром типа расширения DefaultHandler:

public class RSSFeeder<T extends DefaultHandler> extends AsyncTask<Void, Void, Void>{ 
    private T handler; 

    public RSSFeeder(T handler, String feedURL) { 
     this.handler = handler; 
     this.feedURL = feedURL; 
    } 
    ... 

} 
+0

Это исправило это для меня! Итак, теперь мой класс используется так же, как ArrayList ? RSSFeeder ? – oapeter

+0

Да, как и 'ArrayList', теперь это общий тип. – manouti

+0

Большое спасибо за помощь! – oapeter

Смежные вопросы