Ответ 1
В соответствии с JLS, Java SE 7 edition, § 15.20.2 (Оператор сравнения типов instanceof
):
Если преобразование RelationalExpression в ReferenceType будет отклонено как ошибка времени компиляции, то реляционное выражение
instanceof
также производит ошибка времени компиляции. В такой ситуации результат выраженияinstanceof
никогда не может быть правдой.
И < 15.16 (Cast Exions):
Это ошибка времени компиляции, если тип экземпляра времени компиляции никогда не может быть приведение к типу, указанному оператором литья в соответствии с правилами литья преобразование (§ 5.5).
Наконец, § 5.5.1 (Reference Type Casting):
С учетом ссылочного типа времени слияния S (источник) и ссылочного типа времени компиляции T (target), преобразование каста существует от S до T, если ошибки времени компиляции не происходят из-за следующих правил.
[...]
Если S - тип массива SC [], то есть массив компонентов типа SC:
- Если T - тип интерфейса, тогда возникает ошибка времени компиляции, если T не является типом
java.io.Serializable
или типCloneable
(реализованы только интерфейсы по массивам).
Поэтому Java требует, чтобы ваш тест, чтобы увидеть, является ли массив типом экземпляром java.lang.Iterable
, приводит к ошибке времени компиляции.
Если вы хотите попробовать и заставить его работать (всегда возвращать false
) в любом случае, вы можете сначала наложить массив на Object
следующим образом:
System.out.println((((Object)array) instanceof Iterable));