2013-07-25 4 views
0

Во время чтения Horstmann's book, я столкнулся с этим об отношениях подтипа в Java:ява подтип отношения

S is a subtype of T if: 

S is an array type and T is Cloneable or Serializable 

И я не мог по-настоящему понять, что это должно означать. Может ли кто-нибудь помочь?

Спасибо!

+1

Я чувствую, что вы не дает нам всю информацию – aaronman

+0

нужно немного больше контекста – Gus

+0

S и T имеют одинаковый тип S и T являются типами классов, а T является прямым или косвенным суперклассом S S - тип класса, T - тип интерфейса, а S или один из его суперклассов реализует T S и T - оба типа интерфейса , а nd T - прямой или косвенный суперинтерфейс S S и T - оба типа массивов, а компонентный тип S - подтип типа компонента T S не является примитивным типом, а T является типом Object S - нулевой тип, а T не является примитивным типом Это другие примеры отношения подтипа. Помогло ли это? – sha1

ответ

0

Это простой пример подтипирования.

Тип Array реализует интерфейсы Cloneable и Serializable.

Однако эти интерфейсы не указывают какие-либо методы как часть контракта метода. Фактически, это только интерфейсы маркеров, существование которых дает детали компилятору и пользователям ваших классов, не требуя при этом каких-либо функций.

Например:

Обратите внимание, что этот интерфейс не содержит метод клонирования. Следовательно, невозможно клонировать объект только в силу того, что он реализует этот интерфейс. Даже если метод clone активируется рефлексивно, нет никакой гарантии, что он будет успешным.

+0

Я знаком с этими интерфейсами. Но могу ли я присвоить любой тип массива классу, реализующему Cloneable или Serializable, если есть отношение подтипа, которое я должен сделать? – sha1

+0

@ErcanOzturk На самом деле, возможно, нет, поскольку 'java.lang.reflect.Array' не реализует эти интерфейсы, и утверждение в вашем вопросе было бы таким образом неверным для этого бита. – hexafraction

+0

Тогда как я могу использовать это отношение подтипа? Мы просто говорим, что «есть» отношение подтипа? – sha1

0

Я думаю, что вызывает у вас замешательство в том, что «клонируемый» и «сериализация» атрибуты на английском языке, а фраза «является Cloneable» обычно используются, чтобы выразить, что класс реализует интерфейс Cloneable. Однако здесь они только обозначают именно имена интерфейсов Cloneable и Serializable, а «is» следует понимать как «is точно/equals». То есть, если T IS является интерфейсом Cloneable или если T IS является интерфейсом Serializable, тогда любой тип массива является подтипом T.

array type любой тип формы U[], где U произвольный тип, т.е. не- void примитивный или ссылочный тип (обратите внимание, что тип массива, даже примитивного типа, также является ссылкой типа). Это не имеет ничего общего с классом java.lang.reflect.Array, который не тип массива!

Вы не можете назначить любой массив ссылочной переменной класса, реализующего Cloneable или Serializable, но только к опорному переменной именно типа Cloneable или Serializable.Поэтому, если у вас есть

int[] a = ...; // primitive array 
Object[] b = ...; // reference type array 
int[][] c = ...; // reference type array, since int[] is a reference type 

тогда следующее является законным:

Cloneable x = a; x = b; x = c; 
Serializable y = a; y = b; y = c; 

 Смежные вопросы

  • Нет связанных вопросов^_^