无法在 ArrayList 中找到对象的方法

Cannot Find Method of an Object in ArrayList

所以我在 class Ex6 中得到错误 "cannot find symbol - method getIsNational()", 这是涉及的所有 classes 的代码

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;
     }
}

以上是带有一些getter方法的超级class消息

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;
    }
}

上面是subclass 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));
     }
}

上面的 class 是我在第 9 行收到错误的地方,我不明白为什么它找不到方法,我确信这是一个简单的修复,但我该如何解决这个问题? 预先感谢您的帮助。

您必须将 Message 转换为 NationalMessageinstanceof 检查不足以让您调用 getIsNational()

有关转换语法的详细信息,请参阅 Java casting order

好吧,Message class 没有方法 getIsNational 并且您将 messageList 声明为 Message 个对象的列表。
最快的解决方法是添加此方法和

throw new UnsupportedOperationException("Not implemented yet");

如果没有别的。
但我建议创建一些抽象 class 或接口,所有消息 class 都是 extend/implement。这样,您可以声明接口列表(或抽象 classes)并在其中存储 classes 的对象,即列表中的 extend/implement class。
当您以这种方式组织代码时,消息类型的 "specification" 唯一存在于抽象 class(或接口)中,并且各种实现可以保存在单独的 class 中(如 Message 和 NationalMessage in你的例子)。

当您在 messageList 元素中调用 getIsNational() 时,编译器认为该对象的类型为 Message。但是 Message 中没有该名称的方法,因此您应该将元素转换为 NationalMessage ,如下所示

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

在class的方法countNational中Ex6:
更新if条件如下:

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;
  }
}

在您的消息 class 中也添加一个 getIsNational() 方法,但此方法缺失。还有一件事 NullPointerExcpetion ? :) 您需要输入 NullPointerException。