无法在 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
转换为 NationalMessage
。 instanceof
检查不足以让您调用 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。
所以我在 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
转换为 NationalMessage
。 instanceof
检查不足以让您调用 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。