Кто-нибудь может объяснить, что этот код означает на Java?

#java

#java

Вопрос:

Я смотрю на программу, и она содержит строку, которую я не понимаю.

 NoticeBoard notice = (NoticeBoard) o;
  

Что делает этот фрагмент кода?

Эта строка взята отсюда (публикую это, потому что вы, ребята, возможно, захотите понять полный контекст строки):

 import java.util.Observable;
import java.util.Observer;

class NoticeBoard extends Observable
{
    private String theNotice = "";
    public void setTheNotice( final String notice )
    {
        theNotice = notice;
        setChanged();
        notifyObservers();
    }

    public String getTheNotice()
    {
        return theNotice;
    }
}

class NoticeBoardObserver implements Observer
{
    public void update( Observable o, Object arg )
    {
        NoticeBoard notice = (NoticeBoard) o;
        System.out.println( notice.getTheNotice() );
    }
}

class Main
{
    public static void main( String args[] )
    {
        NoticeBoard floor4 = new NoticeBoard();
        NoticeBoardObserver anObserver = new NoticeBoardObserver();
        floor4.addObserver( anObserver );
        floor4.setTheNotice( "Its summer" );
    }
}
  

Комментарии:

1. Учебные пособия по Java — Изучение языка Java — Наследование

Ответ №1:

Это преобразование наблюдаемого объекта с именем o в экземпляр NoticeBoard. Лучше было бы проверить, является ли o экземпляром NoticeBoard (иначе вы получите ClassCastException, если это не так):

 if(o instanceof NoticeBoard) {
    NoticeBoard notice = (NoticeBoard) o;
    System.out.println( notice.getTheNotice() );
}
  

По возможности следует избегать приведения в соответствие типов (например, используя Java Generics), но здесь это необходимо для соответствия сигнатуре интерфейса Observer.

Ответ №2:

Строка, на которую вы ссылаетесь, является приведением. Observable o преобразуется в NoticeBoard . Похоже, что опубликованный вами код реализует шаблон Observer-Observable (http://en.wikipedia.org/wiki/Observer_pattern ). Объект получает уведомление об изменении ( public void update() ) и передает общий наблюдаемый объект, который в вашем случае является NoticeBoard объектом. Чтобы иметь возможность доступа к конкретным методам NoticeBoard объекта, он должен быть приведен.