gpt4 book ai didi

java - 如何将 ArrayList 作为 ArrayList 传递

转载 作者:行者123 更新时间:2023-12-02 03:35:31 24 4
gpt4 key购买 nike

注意:我真的不知道如何提出我的问题,所以我的标题可能没有任何公正。

我开始编写一个 RSS 解析器。我希望用户能够指定他们想要信息的标签,并且我的 parseInnerXmlByTag 方法将返回该类型的 ArrayList。问题是不同的标签具有不同的属性,这意味着我必须为每种类型的标签(“item”、“channel”、“entry”...)创建类。所以我决定创建一个空的 RSSElement 类。然后我创建了一个扩展它的 RSSItem 类。所以我的 parseInnerXmlByTag 现在返回一个 ArrayList < RSSElements >。 我的目标是让用户仅调用一个方法来指定他们想要的标签信息。假设他们指定“item”,该方法应返回 ArrayList < RSSItem >。

但是这样的行不起作用,因为这两种类型在技术上没有关系:

ArrayList<RSSElement> data = (method returning ArrayList<RSSItem>) 

我无法理解通配符和子类型,所以我想知道是否有人可以检查我到目前为止所掌握的内容并告诉我您的想法。这是我的代码

public class RSSParser {
public static ArrayList<RSSElement> parseInnerXmlByTag(String in, String tag)
throws XmlPullParserException, IOException{
ArrayList<RSSElement> data = new ArrayList<>();
StringReader input = new StringReader(in);
try{
XmlPullParser parser = Xml.newPullParser();
parser.setInput(input);
parser.nextTag();
data = readFeed(parser, tag);
}
finally {
input.close();
return data;
}
}

/*
Returns an ArrayList of parsed RSSElements specified by "tag"
*/
private static ArrayList<RSSElement> readFeed(XmlPullParser parser, String tag)
throws XmlPullParserException, IOException{
ArrayList<RSSElement> data = new ArrayList<>();
int event = parser.getEventType();

//Parse until input is consumed
while(event != XmlPullParser.END_DOCUMENT){
switch (event){
case XmlPullParser.START_TAG:
if(parser.getName().equalsIgnoreCase(tag)){
RSSItem item = RSSItem.processItem(parser);
data.add(RSSItem.processItem(parser));
}
break;
}
event = parser.next();
}
return data;
}

public static abstract class RSSElement{
//Private constructor prevents instantiation
private RSSElement(){}
}

public static class RSSItem extends RSSElement{
String title = "";
String description = "";
public RSSItem(String t, String d){
title = t;
description = d;
}

@Override
public String toString() {...}

/*
Parses an RSS item tag into a container RSSItem (ONLY GRABS TITLE RIGHT NOW)
*/
protected static RSSItem processItem(XmlPullParser parser)
throws XmlPullParserException, IOException{
String currentTag = "";
String title = "";
/*
while end tag hasn't been reached yet:
reaching the end tag means parser.getEventType == END_TAG && parser.getName = tag
*/
while(!(parser.next() == XmlPullParser.END_TAG && parser.getName().equalsIgnoreCase("item"))){
Log.i("rssparser", "process entry");
if(parser.getEventType() == XmlPullParser.START_TAG){
currentTag = parser.getName();
}
else if(parser.getEventType() == XmlPullParser.TEXT && currentTag.equalsIgnoreCase("title")){
title = parser.getText();
break;
}
}
return new RSSItem(title, description);
}
}
}

现在此代码已完成并返回 ArrayList。我还知道它根据我的日志正确解析 RSSItems。 但这是我使用它的地方(也就是我在这里发帖的原因)

                @Override
public void onResponse(String response){
ArrayList<? extends RSSParser.RSSElement> items = null;
try {
items = RSSParser.parseInnerXmlByTag(response, "entry");
}...

if(items != null) {
for(int i = 0; i < items.size(); i++){
//****DOESNT WORK****
redditOutputTextView.append(items.get(i).title + "\n");
}
}
else redditOutputTextView.setText("Items null");
}

那一行显然无法工作,因为它不知道它有一个 RSSItems 数组。所以希望有人能弄清楚我正在尝试做什么并提出一些建议。

最佳答案

您能否替换以下代码片段:

//****DOESNT WORK****
redditOutputTextView.append(items.get(i).title + "\n");

通过以下声明:

//****WORKS****
Object obj=items.get(i);
if(obj instanceof RSSItem){
RSSItem rssItem = (RSSItem)obj;
redditOutputTextView.append(rssItem .title + "\n");
}

看到结果了吗?

关于java - 如何将 ArrayList<SubClass> 作为 ArrayList<BaseClass> 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com