【问题标题】:Calling a method from an array-list of objects从对象的数组列表中调用方法
【发布时间】:2024-04-25 15:25:02
【问题描述】:

我刚开始使用 Java,但在使用以下代码时遇到了问题。我正在使用这样的东西从静态方法调用非静态应用方法,但我认为它不是很有效。我设置了需要应用的规则的数组列表,但我无法让它工作。

    ClassificationRule rules = new RuleFirstOccrnc();
    ClassificationRule rules1 = new RuleOccrncCount();
    rules.apply(aUserInput);
    rules1.apply(aUserInput); 

我在尝试从 ClassificationRule 调用 apply() 方法时遇到此错误“方法 apply(String) 未定义为 ArrayList 类型”。任何帮助将不胜感激!

package tweetClassification;

import java.util.ArrayList;

public class PrioritRuls {

    //Set of rules to be applied
    final static ArrayList<ClassificationRule> rulesA
        = new ArrayList<ClassificationRule>();

    static{
        rulesA.add( new RuleFirstOccrnc() );
        rulesA.add( new RuleOccrncCount() );
    }

    // ******************************************* 
    public static void prioritize( final String aUserInput ){

        rulesA.apply(aUserInput); //ERROR
       // The method apply(String) is undefined
       // for the type ArrayList<ClassificationRule>
        }
} 
package tweetClassification;

public class ClassificationRule {

     // *******************************************
     public void apply (final String aUserInput) {  

        apply( aUserInput );
        }
}

【问题讨论】:

    标签: java methods static arraylist non-static


    【解决方案1】:

    对,因为您在数组列表对象上调用apply 方法,而不是数组列表的内容。

    改成类似

    rulesA.get(0).apply()
    

    或者,如果你想在每个元素上调用它,你需要遍历列表。

    for (ClassificationRule rule:rulesA){
      rule.apply(aUserInput);
    }
    

    【讨论】:

    • 感谢您提供完美的快速响应。非常感谢!
    【解决方案2】:

    您试图在 ArrayList 上调用 apply(),而不是在 ClassificationRule 对象上。 ArrayList 没有这个方法,所以正如预期的那样 - 你得到一个编译错误。

    您可能希望使用for-each loop 在每个ClassificationRule 对象上迭代 ArrayListapply()

    for (ClassificationRule rule : rulesA) rule.apply(aUserInput)
    

    apply() 特定元素

    rulesA.get(someIndex).apply(aUserInput)
    

    还有一件事:

    public void apply (final String aUserInput) {  
       apply( aUserInput );
    }
    

    将导致对apply()无限递归调用[嗯,不完全是无限的,它最终会抛出异常]。这不是您当前遇到的错误,因为这是运行时错误,而您仍然停留在编译时错误。

    【讨论】:

    • 欢迎您@tom3322,祝您好运!稍后不要忘记accept其中一个答案。
    • 关于 apply() 你建议我如何解决这个问题,我没有收到任何错误。我正在尝试使用继承调用规则的非静态 apply() 方法。