что на самом деле означает типизация в Java? - PullRequest
0 голосов
/ 05 августа 2011

Меняет ли он один объект на другой?если Imonitor это интерфейс, что означает Imonitor[] x = new Imonitor();?Значит ли это, что мы можем создавать объекты интерфейсов?

Ответы [ 6 ]

3 голосов
/ 05 августа 2011

Ну, кастинг делает разные вещи в зависимости от того, о каких типах вы говорите. Рассмотрим:

Object x = "hello";
String y = (String) x;

Это не меняет тип объекта - но он преобразует ссылку типа Object в ссылку типа String , проверяя, что ссылка ссылается на String (или, в более общем случае, на целевой тип приведения или подкласса) или на ноль.

Для примитивных типов фактически создает новое значение данных другого типа, изменяя скопированную информацию , а не просто изменяя ссылку на информацию:

double x = 10.5;
int y = (int) x; // The value of y is 10; x is unchanged though.

Относительно интерфейсов:

Imonitor[] x = new Imonitor();

Это не скомпилируется напрямую. Но это будет:

Imonitor[] x = new Imonitor[2];

Это не создает никаких экземпляров самого Imonitor - это просто создание массива с двумя «слотами», способными хранить ссылки на объекты типов, реализующих Imonitor. Начальное значение в обоих этих слотах будет null; затем вы можете заполнить массив следующим образом:

x[0] = new FirstImplementation();
x[1] = new SecondImplemnentation();

... создание экземпляров конкретных классов реализации.

1 голос
/ 05 августа 2011

Как уже говорили другие (и я это сделал в своем комментарии), вы не можете напрямую создать экземпляр интерфейса.Я предлагаю вам ознакомиться с интерфейсами Java, чтобы лучше ознакомиться с ними - поначалу они могут сбивать с толку, но они являются важной частью языка.

Вот раздел об интерфейсахна уроках Java.

1 голос
/ 05 августа 2011

new Imonitor () не будет работать, если Imonitor является интерфейсом - вы получите ошибку компиляции.

Приведение объекта означает изменение типа, который, по мнению компилятора, имеет объект (статический тип)и делает проверки против.Когда программа запускается, JavaVm проверяет, что приведение является допустимым, если не генерируется исключение.

Интерфейсы никогда не могут быть объектами, у вас должен быть класс, реализующий интерфейс для этого.

1 голос
/ 05 августа 2011

, если Imonitor - интерфейс, чем new Imonitor(); не работает.

Imonitor[] x - массив Imonitor, а не переменная Imonitor.

1 голос
/ 05 августа 2011

Меняет ли он один объект на другой?

(1) Нет. Для ссылочных типов

a = (typename)b; 

сообщает компилятору, чтовы «знаете», что объект, на который указывает «b», также является объектом типа «typename».То есть это оператор над ссылками, а не объект.(Для примитивных типов это фактически преобразование).

, если Imonitor является интерфейсом, что делает Imonitor [] x = new Imonitor ();средства?

(2) Не скомпилируется.Imonitor - это имя типа.Imonitor [] - это массив IMonitors.

Означает ли это, что мы можем создавать объекты интерфейсов?

(3) Нет. Но выможет создать массив ссылок на Imonitor, что будет делать

new IMonitor[3]

.

0 голосов
/ 05 августа 2011

Типизация также известна как преобразование типа , оно предназначено для изменения объекта с одного типа данных на другой. В непримитивных объектах приведение типов выполняется для объектов, которые имеют определенные особенности иерархий. Пример: объект Person имеет 2 подкласса с именами Parent и Child (оба подкласса имеют одинаковую иерархическую структуру, поскольку они наследуют Person), поэтому это допустимое преобразование типа:

Person person = new Parent();
Parent parent = (Parent) person;

Для вашего примера, Imonitor[] x = new Imonitor(); не будет компилироваться, поскольку вы присваиваете один объект Imonitor экземпляру, который ожидает массив Imonitor.

Но это скомпилируется:

Imonitor[] x = new Imonitor[2]; //Assigning 2 elements to array 'x'

Предположим, у вас есть интерфейс:

public interface IMonitor {

    public void monitor(Monitorable object) throws MonitorException;
}

Тогда это будет не пример приведения типа, а назначение:

IMonitor x = new IMonitor() {
            public void monitor(Monitorable object) throws MonitorException {
                //Implementation done here...
            }
        };

(В приведенном выше примере демонстрируется анонимный класс ).

Надеюсь, это понятно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...