【问题标题】:Cannot Find Method of an Object in ArrayList在 ArrayList 中找不到对象的方法
【发布时间】:2016-05-15 21:02:00
【问题描述】:

所以我在 Ex6 类中收到错误“找不到符号 - 方法 getIsNational()”, 这是所有涉及的类的代码

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方法的超类Message

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 行得到错误的地方,我不明白为什么它找不到方法,我确定这是一个简单的修复,但我该如何解决这个问题? 提前感谢您的帮助。

【问题讨论】:

  • 在旁注中,您不应该关注NullPointerExceptions。而是做一个空检查..

标签: java arraylist subclass superclass


【解决方案1】:

您必须将Message 转换为NationalMessageinstanceof 支票不足以让您致电 getIsNational()

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

【讨论】:

  • 我尝试使用这一行“if((NationalMessage)messageList.get(i).getIsNational()){”但它没有用,这行有什么问题?
  • 试试(((NationalMessage)messageList.get(i)).getIsNational()) 否则你尝试转换getIsNational()的结果
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    在Ex6类的countNational方法中:
    更新 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;
      }
    }
    

    【讨论】:

      【解决方案4】:

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

      throw new UnsupportedOperationException("Not implemented yet");
      

      如果没有别的。
      但我建议创建一些所有消息类都扩展/实现的抽象类或接口。这样,您可以声明接口(或抽象类)列表,并在其中存储从列表扩展/实现类的类的对象。
      当您以这种方式组织代码时,消息类型的“规范”唯一地存在于抽象类(或接口)中,并且各种实现可以保存在单独的类中(例如您的示例中的 Message 和 NationalMessage)。

      【讨论】:

        【解决方案5】:

        在缺少的 Message 类中也放置一个 getIsNational() 方法。还有一件事 NullPointerExcpetion ? :) 你需要输入 NullPointerException。

        【讨论】:

        • 哈哈是的,我注意到一旦其他问题解决了 :) 幸运的是我知道如何解决这个问题啊哈,谢谢您的帮助
        猜你喜欢
        • 2017-05-26
        • 1970-01-01
        • 2014-07-10
        • 2015-03-26
        • 1970-01-01
        • 2017-08-17
        • 2013-04-14
        • 1970-01-01
        相关资源
        最近更新 更多