Java向下转型

时间:2012-01-23 12:06:39

标签: java downcast

你有一个这样的课程

import java.util.ArrayList;

public class MobilePhone {

    private String number;
    private ArrayList<Message> messages;



    public MobilePhone(String n) {
        this.number = n;
        this.messages = new ArrayList<Message>();
    }

    public String getNumber() {
        return number;
    }

    public void setMessages(Message messages) {
        this.messages.add(messages);
    }

    public ArrayList<Message> getMessages() {
        return messages;
    }

}

然后是一个Message类

public class Message {

    protected String sender;
    protected String receiver;
    protected String subject;
    protected String bodyText;
    protected int tipo;

    protected Message() {
        this.sender = this.receiver = this.subject =
        this.bodyText = "";
    }

    protected Message(String s, String r, String sbj, String b, int t ) {
        this.sender = s;
        this.receiver = r;
        this.subject = sbj;
        this.bodyText = b;
        this.tipo = t;
    }

    public String getSender() {
        return sender;
    }

    public String getSubject() {
        return subject;
    }

    public String getBodyText() {
        return bodyText;
    }

    public int getTipo() {
        return tipo;
    }


}

还有一个子类

public class SMS extends Message {
    static int maxBodySize = 160;


    public void showMessage(){
        System.out.println("SMS");
        System.out.println("Subject: " + super.subject);
        System.out.println("Text: " + super.bodyText);
    }
}

在我的代码中我有这个:

    for (MobilePhone item : listaTelefones) {
         for (Message item2: item.getMessages()){
             ((SMS) item2).showMessage();
         }
    }

它给了我这个错误:

Exception in thread "main" java.lang.ClassCastException: Message cannot be cast to SMS

我不能将消息转发给SMS,以便我可以使用SMS showMessage()方法吗?

3 个答案:

答案 0 :(得分:2)

列表中的某些项目属于班级Message,但不属于班级SMS。因此,您无法将它们投射到课程SMS

添加类似内容以确保您正在处理SMS

if (item2 instanceof SMS) {
    ((SMS) item2).showMessage();
}

答案 1 :(得分:2)

您需要先检查Message类型SMS是否属于Messages,因为并非所有SMS都是if(item2 instanceof SMS) { ((SMS) item2).showMessage(); }

SMS

这将确保您不会尝试将非SMS类型的邮件投射到{{1}}类型。

答案 2 :(得分:1)

您必须在列表中添加Message。之一:

测试类型:

if (item2 instanceof SMS) {
    ((SMS) item2).showMessage();
} else {
    // ?
}

如果你知道他们是短信,请输入你的短信列表:

private ArrayList<SMS> messages;

public ArrayList<SMS> getMessages() {
    return messages;
}