如何在另一个类中调用列表对象
Posted
技术标签:
【中文标题】如何在另一个类中调用列表对象【英文标题】:How to call list objects inside another class 【发布时间】:2015-05-01 15:01:57 【问题描述】:我在名为Scorer.java
的类中有一个列表对象,我想在另一个名为MyParser.java
的类中导入aLinks
和bLinks
对象以打印aLinks.size()
和bLinks.size()
我试图导入类首先命名调用对象,但我不能这样做。你能告诉我如何将列表的对象从类导入到另一个类吗?以下是课程:
我的Scorer.java
:
public class Scorer
public static List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links)
List<LinkNode> aLinks = new LinkedList<>();
List<LinkNode> bLinks = new LinkedList<>();
for (LinkNode link : links)
if(isbLink(sourceLink, link))
bLinks.add(link);
else
aLinks.add(link);
我的其他班级MyParser.java
public class MyParser
private static final String[] PARSE_TAGS = new String[]"a[href", "area[href";
public static List<LinkNode> parse(LinkNode inputLink)
Set<LinkNode> outputLinks = new LinkedHashSet<>();
try
Document parsedResults = Jsoup
.connect(inputLink.getUrl())
.timeout(READ_TIMEOUT_IN_MILLISSECS)
.get();
String tag;
Elements elements;
List<LinkNode> result;
//a[href
tag = "a[href";
elements = parsedResults.select(tag);
result = toLinks(inputLink, elements, tag);
outputLinks.addAll(result);
// I want to print `aLinks.size()` and `bLinks.size()` here
return new LinkedList<>(outputLinks);
【问题讨论】:
【参考方案1】:只要打电话
MyParser myparser = new MyParser ();
myparser.parse(scorerInstance.getAlinks());
myparser.parse(scorerInstance.getBlinks());
scorerInstance
是 MyScorer 的一个实例。您应该在 MyScorer
类中为 aLinks
和 bLinks
添加吸气剂,如下所示:
public List<LinkNode> getALinks()
return aLinks;
public List<LinkNode> getBLinks()
return bLinks;
【讨论】:
aLinks
和bLinks
是(静态)方法score
中的实例变量。这是行不通的。
对不起,但仍然出现错误:参数 aLinks 的修饰符非法;只允许 final 并且错误:参数 bLinks 的非法修饰符;只允许决赛@Master Mind
谢谢@MasterMind 我解决了这个问题。感谢您的帮助。
再次感谢。第一次我将它添加到Score
列表中的Scorer
类中并收到此错误。之后,我使用public static
方法将它添加到Score
列表之外,现在它工作正常。我只是想知道这会影响我的程序,因为我在score
列表之外带来了aLinks
和bLinks
行代码? @MasterMind
如果它们属于 Score,最好将它们放入 Score 中。否则,不。【参考方案2】:
您必须在Scorer
类中将所需的变量声明为全局变量和public
以及static
public class Scorer
public static List<LinkNode> aLinks = new LinkedList<>();
public static List<LinkNode> bLinks = new LinkedList<>();
public static List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links)
for (LinkNode link : links)
if(isbLink(sourceLink, link))
bLinks.add(link);
else
aLinks.add(link);
然后在MyParser
类中,调用class_name .(dot) static_variable 。
然后在MyParser
类中试试这个:
System.out.println(Scorer.aLinks.size()+ " " + Scorer.bLinks.size());
【讨论】:
score()
是一个静态方法。这是行不通的。
我做不到。我有:允许参数的非法修饰符仅 final 。我 cpuld 没有在代码前面写 public @Md.NasirUddinBhuiyan
@medo0070 这是因为您没有将定义移出方法并将其转换为字段。你必须把它放在方法定义之外。【参考方案3】:
如果类位于不同的包中,您需要将链接公开。但是您还需要将其设为静态并将其转换为类的字段
public class Scorer
public static List<LinkNode> aLinks = new LinkedList<>();
那你就可以Scorer.alinks
访问了
【讨论】:
感谢您的帮助,但它不起作用。该程序不允许我在 List aLinks = new LinkedList(); 前面添加public static
它说:illegal modifier for parameter only final is permitted
@Evan Williams
@medo0070 将行移出方法并直接在public class Scorer
下,就像我在回答中所做的那样。
谢谢你现在的工作,但我想问这会影响我的程序吗?我的意思是在我的 lins 中 List<LinkNode> aLinks = new LinkedList<>();
和 List<LinkNode> bLinks = new LinkedList<>();
在里面 List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links)
因为 score
正在收集我的 aLinks
和 bLinks
? @埃文威廉姆斯
@medo0070 这取决于你想要什么行为。如果您每次运行score
时都想要一个新的aLinks 和bLinks,您需要每次都初始化它们(不要再次声明它们!)。因此,您可以将aLinks = new LinkedList<>();
和bLinks = new LinkedList<>();
添加到score
方法的顶部,并从声明变量的位置删除`= new LinkedList()`,因此声明看起来像public static List<LinkNode> aLinks;
和@987654337 @
我按照你说的做了,但运行一段时间后出现错误。我想我会在删除 `= new LinkedList()` 之前保持原样。我在aLinks
和bLinks
顶部的score list
将从aLinks
和bLinks
收集信息并将它们添加到single list
。因此,如果我在我写的问题中将它们排除在score
列表之外。这会让我得到不真实或不预期的结果吗?非常感谢@Evan Williamsas【参考方案4】:
首先aLinks
和bLinks
应该是Scorer
类的成员,并且不应在该类的方法中声明。
像这样:
public class Scorer
public List<LinkNode> aLinks = new LinkedList<>();
public List<LinkNode> bLinks = new LinkedList<>();
其次,您必须在 MyParser
类中获得一个 Scorer
对象。然后您可以访问aLinks
和BLinks
。应该是这样的:
Scorer myScorer = new Scorer();
System.out.println(myScorer.aLinks().size());
System.out.println(myScorer.bLinks().size());
这应该添加到 MyParser
类中的注释部分的位置。
第三,如果您的score
方法是静态的,那么您的score
方法中也应该有一个Score
类的实例。您可以将该实例传递给score
方法。像这样:
public static List<LinkNode> score(LinkNode sourceLink, List<LinkNode> links, Score myScore)
//myScore.aLinks or myScore.bLinks can be used here
【讨论】:
score()
是一个静态方法。这是行不通的。
哦!我错过了。让我编辑代码。感谢您指出!
我出错了,我无法在它所说的代码前添加“Public”:允许参数的非法修饰符仅 final @soham.m17
因此 aLinks 和 bLinks 是静态的,因此您可以将 getter getBLinks()
static
好的。第一件事。 score
不是列表,而是方法。 Scorer
是一个类。当您在 score
函数中添加这两个声明语句时,您不能将这些变量设为公开。这就是为什么我告诉你在score
方法之外添加那些。现在我没有告诉你让他们static
。当您将它们设为static
时,您为Scorer
类创建的所有对象的列表都是相同的。如果您有myScorerChemistry
和myScorerPhysics
,它们将具有相同的aLinks
和bLinks
,并且没有区别。如果这就是你想要的,那就继续吧。以上是关于如何在另一个类中调用列表对象的主要内容,如果未能解决你的问题,请参考以下文章