2016-05-15 3 views
0

Так что я получаю ошибку «не удается найти символ - метод getIsNational()» в классе EX6, здесь код для всех классов участвуютНе удается найти метод объекта в ArrayList

public class Message 
{ 
    private String sender; 
    private String receiver; 
    private String content; 

    public Message(String ssender, String rreceiver, String ccontent){ 
     sender=ssender; 
     receiver=rreceiver; 
     content=ccontent; 
    } 

    public String getSender(){ 
     return sender; 
    } 

    public String getReceiver(){ 
     return receiver; 
    } 

    public String getContent(){ 
     return content; 
    } 
} 

Выше супер класс сообщений с некоторыми методами геттерных

public class NationalMessage extends Message 
{ 
    private boolean isNational; 
    public NationalMessage(String ssender, String rreceiver, String ccontent){ 
     super(ssender, rreceiver, ccontent); 
     if(ssender.startsWith("UK") && rreceiver.startsWith("UK")){ //If the sender and reciever are from uk then it is national 
      isNational = true; 
     }else{//if not then it isnt national 
      isNational=false; 
     } 
    } 
    public boolean getIsNational(){ 
     return isNational; 
    } 
} 

выше подкласс NationalMessage

import java.util.*; 
public class Ex6 { 
    public static int countNational (ArrayList<Message> messageList) { 
     // This method just adds up the amount of Messages that are of type NationalMessage and when getIsNational is true. 
     int sum = 0; 
     try{ 
      for(int i = 0; i < messageList.size(); i++){ //loop through arraylist given 
       if(messageList.get(i) instanceof NationalMessage){//if its of this type continue 
        if((messageList.get(i)).getIsNational()){ //Error occurs here 
         sum += 1; 
        } 
       } 
       } 
      return sum; 
     }catch(NullPointerExcpetion e){//in the case of messageList being null 
      System.out.println("Error"); 
      return -1; 
     } 
    } 
    public static void main(String[] args){ // you can use this main method to test your 
     ArrayList<Message> messageList = new ArrayList<Message>(); 
     messageList.add(new NationalMessage("UKJohn","UKMark","aa")); 
     messageList.add(new NationalMessage("UKJohn","FRJean","aa")); 
     messageList.add(new Message("Mike","John","aa")); 
     System.out.println(countNational(messageList)); 
    } 
} 

И класс выше, где я получаю ошибку в строке 9, я не понимаю, почему он не может найти метод, я уверен, что это простое исправление, но как я могу это решить? Заранее благодарим за помощь.

+0

на боковой ноте, вы не должны ловить 'NullPointerException'. Вместо этого сделайте нулевую проверку. –

ответ

0

Когда вы вызываете getIsNational() в элементе messageList, компилятор считает, что объект имеет тип Message. Но нет никакого способа в Сообщении с этим именем, так что вы должны бросить элемент NationalMessage, как показано ниже

if(((NationalMessage)messageList.get(i)).getIsNational()){.. 
+1

Ах отлично спасибо большое – user3115941

3

Вы должны указать Message на NationalMessage. instanceof проверка не достаточно для того, чтобы быть в состоянии назвать getIsNational()

для деталей синтаксиса литья см Java casting order

+0

Я попытался использовать эту строку «if ((NationalMessage) messageList.get (i) .getIsNational()) {« но это не сработало, что делаете неправильно в этой строке? – user3115941

+1

try '(((NationalMessage) messageList.get (i)). GetIsNational())' В противном случае вы попытаетесь направить результат 'getIsNational()' – user140547

0

Ну, Message класс не имеет метод getIsNational и вы объявили messageList в списке Message объектов.
Самый быстрый фикс бы добавить этот метод и

throw new UnsupportedOperationException("Not implemented yet"); 

, если ничего другого.
Но я бы предложил создать абстрактный класс или интерфейс, чтобы все классы сообщений расширялись/реализовывались. Таким образом, вы можете объявить список интерфейсов (или абстрактных классов) и сохранить в нем объекты классов, которые расширяют/реализуют класс из списка.
Когда вы организовываете код таким образом, «спецификация» типов сообщений уникальна в абстрактном классе (или интерфейсе), и различные реализации могут храниться в отдельных классах (например, Message и NationalMessage в вашем примере).

0

В методе countNational класса EX6:
Update если условие следующим образом:

if(messageList.get(i) instanceof NationalMessage){//if its of this type continue 
    final NationalMessage nationalMessage = (NationalMessage) messageList.get(i) // You need to cast the object to NationalMessage after checking that the objectis an instance of NationalMessage 
    if(nationalMessage.getIsNational()){ //Error occurs here 
    sum += 1; 
    } 
} 
0

введите метод getIsNational() также в свой класс сообщений, который отсутствует. И еще одно: NullPointerExcpetion? :) вам нужно вместо этого ввести NullPointerException.

+0

haha ​​yeah Я заметил, что после другая проблема была решена :) к счастью, я знал, как исправить эту ага, спасибо за помощь – user3115941

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