Java – это строго типизированный язык, обладающий относительно большим числом типов данных. В то же время JavaScript является нетипизированным
246 Глава 12. Разработка сценариев для Java*приложений
языком, обладающим сравнительно небольшим числом типов данных. Посколь_ ку между этими языками имеется такое существенное структурное различие, одна из основных обязанностей LiveConnect заключается в выполнении кор_ ректного преобразования типов данных. Когда JavaScript_сценарий записывает значение в поле Java_объекта или передает аргумент Java_методу, JavaScript_ значение должно быть преобразовано в эквивалентное Java_значение. Когда JavaScript_сценарий читает значение поля Java_объекта или получает возвра_ щаемое значение Java_метода, Java_значение должно быть преобразовано в со_ вместимый тип данных языка JavaScript. К сожалению, преобразование данных в LiveConnect реализовано несколько иначе, нежели в пакете javax.script.
Рисунки 12.1 и 12.2 иллюстрируют порядок преобразования данных при записи значений из JavaScript_сценария в Java_программу, и наоборот.
Обратите внимание на следующие замечания, касающиеся порядка преобразо_ вания данных на рис. 12.1:
• На рисунке показаны не все возможные варианты преобразования типов Java_ Script_данных в типы Java_данных, потому что перед преобразованием из Java_ Script в Java может произойти внутреннее преобразование JavaScript_данных. Например, если JavaScript_сценарий передает число Java_методу, который ожидает получить аргумент типа java.lang.String, интерпретатор JavaScript сначала преобразует число в строку, а затем преобразует ее в Java_строку.
• JavaScript_число может быть преобразовано в любой из элементарных число_ вых типов языка Java. Какое из преобразований будет выбрано, зависит от ти_ па целевого Java_поля или аргумента Java_метода. Обратите внимание: в ходе преобразования может быть утеряна точность числа, например, когда слиш_ ком большое число записывается в Java_поле типа short или производится преобразование вещественного значения в целочисленный Java_тип.
Рис. 12.1. Преобразование данных при записи Java'значений из JavaScript'сценариев
12.2. Взаимодействие с Java*кодом
• JavaScript_число может быть также преобразовано в экземпляр Java_класса java.lang.Double, но никогда – в экземпляры родственных классов, таких как java.lang.Integer и java.lang.Float.
• В JavaScript отсутствует тип данных для представления символов, поэтому числа JavaScript могут быть преобразованы в элементарный Java_тип char.
• Когда из JavaScript в Java передается объект JavaObject, он «разворачивает_ ся»1, благодаря чему преобразуется в тот Java_объект, который он представ_ ляет. Однако объекты класса JavaClass в JavaScript не преобразуются в экзем_ пляры класса java.lang.Class, как того можно было бы ожидать.
• JavaScript_массивы никак не преобразуются в Java_массивы. Объекты, мас_ сивы и функции языка JavaScript преобразуются в Java_объекты, не имею_ щие стандартизованного прикладного интерфейса и обычно рассматривае_ мые как «черные ящики».
К преобразованиям данных, которые приводятся на рис. 12.2, также имеется не_ сколько пояснений:
• Поскольку JavaScript не имеет типа для представления символьных данных, элементарный Java_тип char преобразуется в числовой JavaScript_тип, а не в строку, как можно было бы ожидать.
Рис. 12.2. Преобразование данных при чтении Java'значений в JavaScript'сценариях
1 Имеется в виду, что с него «снимается» обертка JavaObject и «остается» ссылка на Java_объект. – Примеч. науч. ред.
248 Глава 12. Разработка сценариев для Java*приложений
• Экземпляры java.lang.Double, java.lang.Integer и аналогичных им классов не преобразуются в JavaScript_числа. Подобно любым другим Java_объектам, они преобразуются в объекты JavaObject.
• Строки в языке Java являются экземплярами класса java.lang.String, поэто_ му, подобно любым другим Java_объектам, они преобразуются в объекты JavaObject, а не в JavaScript_строки.
• Java_массивы любого типа в JavaScript преобразуются в объекты JavaArray.