Я думаю, что вызывает у вас замешательство в том, что «клонируемый» и «сериализация» атрибуты на английском языке, а фраза «является 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;
Я чувствую, что вы не дает нам всю информацию – aaronman
нужно немного больше контекста – Gus
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