2012-04-08 3 views
2

Я только начинаю с Java, и у меня возникают проблемы со следующим кодом. Я использовал что-то вроде этого, чтобы вызвать метод нестатического применения из статического метода, но я не считаю его очень эффективным. Я установил список массивов правил, которые необходимо применить, но я не могу заставить его работать.Вызов метода из массива-списка объектов

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

Я получаю эту ошибку при попытке вызвать метод применить() из ClassificationRule «Метод применим (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); 
     } 
} 

ответ

3

Правильно, потому что вы звоните в apply метод объекта списка массива, а не содержимое списка массива.

Изменить его на что-то вроде

rulesA.get(0).apply() 

Или, если вы хотите вызвать его на каждый элемент, вам нужно перебирать список.

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

Спасибо за быстрый ответ, который имеет прекрасный смысл. Очень ценим! – tom3322

1

Вы пытаетесь вызвать apply() на ArrayList вместо этого на ClassificationRule объекта. ArrayList не имеет этого метода, поэтому, как и ожидалось, вы получаете ошибку компиляции.

Вы можете итерация в ArrayList и apply() на каждом ClassificationRule объекта с for-each loop:

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

или apply() на конкретного элемента:

rulesA.get(someIndex).apply(aUserInput) 

еще один вещь:

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

вызовет бесконечные рекурсивные вызовы apply() [ну, не совсем бесконечен, он будет бросать в конечном итоге исключение]. Это не ошибка, с которой вы сейчас сталкиваетесь, поскольку это ошибка во время выполнения, в то время как вы все еще застреваете во время компиляции.

+0

Большое спасибо за объяснение, я получил его на работу. :) – tom3322

+0

Тебе больше всего нравится @ tom3322, и удачи! не забудьте [принять] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) один из ответов позже. – amit

+0

о apply() как вы предлагаете я исправить это, я не получаю никаких ошибок. Я пытаюсь вызвать нестатический метод apply() правил с использованием наследования. – tom3322

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