Class.isAssignableFrom()
по существу проверяет отношение подтипа . «подтип» и «подкласс» - это два разных понятия. Иерархия классов (т.е. создание подклассов) является лишь частью подтипирования.
Примитивные типы и типы массивов имеют особые случаи для подтипирования.
Правила для подтипов типов массивов такие (обратите внимание, что "> 1 " означает "это прямой подтип"):
- Если
S
и T
являются ссылочными типами, то S[]
> 1 T[]
если S
> 1 T
.
Object
> 1 Object[]
Cloneable
> 1 Object[]
java.io.Serializable
> 1 Object[]
- Если
p
является примитивным типом, то:
Object
> 1 p[]
Cloneable
> 1 p[]
java.io.Serializable
> 1 p[]
Важной частью вашего вопроса является самый первый элемент: тип массива X[]
является подтипом типа массива Y[]
тогда и только тогда, когда тип компонента X
является подтипом типа компонента Y
.
Также обратите внимание, что строго говоря, Object[]
и String[]
не являются классами. Это "только" типы. Хотя каждый класс неявно является типом, обратное неверно. Другим примером типов, которые не являются классами, являются примитивные типы: boolean
, byte
, char
, short
, int
, long
, float
и double
являются типами, но они не классы.
Другой причиной путаницы является тот факт, что вы можете легко получить java.lang.Class
объектов, представляющих эти типы . Опять же: это не означает, что эти типы являются классами.