Конвертация Типов Данных
Поскольку язык
Java строго типизирован, а
JavaScript типизирован слабо, машина выполнения
JavaScript конвертирует значения аргументов в типы данных, подходящие для других языков, если вы используете
LiveConnect. Эта конвертация описана в разделах:
- Конвертация JavaScript в Java
- Конвертация Java в JavaScript
Конвертация JavaScript в Java
Если вы вызываете
Java-метод и передаёте ему параметры из
JavaScript, типы данных передаваемых параметров конвертируются в соответствии с правилами, описанными в следующих разделах:
- Числа
- Булевы Значения
- Строковые Значения
- Undefined-Значения
- Null-Значения
- Объекты JavaArray и JavaObject
- JavaClass-Объекты
- Другие Объекты JavaScript
return-значения методов объекта
netscape.javascript.JSObject всегда конвертируются в экземпляры объекта
java.lang.Object. Правила конвертации этих
return-значений также описаны в этих разделах.
Например, если
JSObject.eval возвращает
JavaScript-число, вы можете найти правила конвертации этого числа в экземпляр объекта
java.lang.Object в разделе Числа.
Числа
Если вы передаёте числовые типы
JavaScript в качестве параметров методам
Java,
Java конвертирует эти значения в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии |
double | Точное значение переносится в Java без округления и без потери точности или знака. |
lava.lang.Double, java.lang.Object | Создаётся новый экземпляр java.lang.Double, и точное значение передаётся в Java без округления и без потери точности или знака. |
float | Значения округляются до чисел с плавающей точкой;Значения, которые слишком малы или велики, чтобы быть представленными, округляются до +infinity или -infinity. |
byte, char, int, long, short | Значения округляются с использованием режима round-to-negative-infinity/округление-в-сторону-отрицательной-бесконечности; Значения, которые слишком малы или велики, чтобы быть представленными, дают ошибку времени выполнения; Значения NaN конвертируются до нуля. |
java.lang.String | Значения конвертируются в строки. Например: 237 становится 237 |
boolean | Значения 0 и NaN конвертируются в false, другие значения конвертируются в true. |
Если число
JavaScript передаётся в качестве параметра в
Java-метод, который ожидает экземпляр объекта
java.lang.String, это число конвертируется в строку. Используйте метод equals()** для сравнения результата этой конвертации с другими строковыми значениями.
Булевы Значения
Если вы передаёте Булевы типы
JavaScript как параметры для
Java-методов,
Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии |
boolean | Все значения конвертируются непосредственно в Java-эквиваленты. |
lava.lang.Boolean, java.lang.Object | Создаётся новый экземпляр объекта java.lang.Boolean. Каждый параметр создаёт новый экземпляр, а не один экземпляр с тем же примитивным значением. |
java.lang.String | Значения конвертируются в строки. Например: true становится true, false становится false |
byte, char, double, float, int, long, short | true становится 1; false становится 0 |
Если Булево значение
JavaScript передаётся в качестве параметра
Java-методу, ожидающему экземпляр объекта
java.lang.String, Булево значение конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
Строковые Значения
Если вы передаёте строковые типы
JavaScript как параметры для
Java-методов,
Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии
|
lava.lang.String, java.lang.Object|Строка JavaScript конвертируется в экземпляр объекта java.lang.String со значением Unicode.||
byte, double, float, int, long, short | Все значения конвертируются в числа так, как описано в ECMA-262.Строковые значения Java Script? конвертируются в числа в соответствии с правилами ECMA-262 |
char | Односимвольные строки конвертируются в Unicode-символы.Все иные значения конвертируются в числа. |
boolean | Пустая строка становится false, все иные значения становятся true. |
Undefined-Значения
Если вы передаёте значения
undefined JavaScript в качестве параметров методам
Java,
Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии |
lava.lang.String, java.lang.Object | Значение конвертируется в экземпляр объекта java.lang.String, значением которого является строка undefined. |
boolean | Значение становится false. |
double, float | Значение становится NaN. |
byte, char, int, long, short | Значение становится 0. |
Если значение
undefined JavaScript передаётся в качестве параметра
Java-методу, который ожидает экземпляр объекта
java.lang.String, значение
undefined конвертируется в строку. Используйте операцию == для сравнения результата этой конвертации с другими строковыми значениями.
Null-Значения
Если вы передаёте значения
null JavaScript в качестве параметра
Java-методам,
Java конвертирует значения в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии |
Любой класс и любой тип интерфейса | Значение становится null. |
byte, char, double, float, int, long, short | Значение становится 0. |
boolean | Значение становится false. |
Объекты JavaArray и JavaObject
В большинстве случаев, если вы передаёте
JavaArray или
JavaObject JavaScript в качестве параметра
Java-методу,
Java просто снимает оболочку с объекта; в некоторых случаях объект приводится к другому типу данных в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии |
Любой интерфейс или класс, совместимый при присвоении с развёрнутым /unwrapped объектом. | Объект разворачивается. |
java.lang.String | Объект разворачивается, вызывается метод toString развёрнутого Java-объекта, и результат возвращается как новый экземпляр объекта java.lang.String. |
byte, char, double, float, int, long, short | Объект разворачивается, и возникает одна из следующих ситуаций: Если развёрнутый Java-объект имеет метод doubleValue, the JavaArray или JavaObject конвертируется в значение, возвращаемое этим методом; Если развёрнутый Java-объект не имеет метода doubleValue, возникает ошибка. |
boolean | Объект разворачивается, и возникает одна из следующих ситуаций: Если объект – null, он конвертируется в false; Если объект имеет какое-либо другое значение, он конвертируется в true. |
Объекты JavaClass
Если вы передаёте объект
JavaClass из
JavaScript в качестве параметра
Java-методу,
Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | **Правила Конверсии |
java.lang.Class | Объект разворачивается. |
java.lang.JSObject, java.lang.Object | Объект JavaClas разворачивается в новый экземпляр объекта java.lang.JSObject. |
java.lang.String | Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String. |
boolean | Объект разворачивается, и возникает одна из следующих ситуаций: Если объект – null, он конвертируется в false; Если объект имеет какое-либо другое значение, он конвертируется в true. |
Другие Объекты JavaScript
Если вы передаёте любой иной объект
JavaScript в качестве параметра
Java-методу,
Java конвертирует значение в соответствии с правилами, описанными в следующей таблице:
Тип Java-параметра | Правила Конверсии |
java.lang.JSObject, java.lang.Object | Объект разворачивается в новый экземпляр объекта java.lang.JSObject. |
java.lang.String | Объект разворачивается, вызывается метод toString развёрнутого Java-объекта и результат возвращается как новый экземпляр объекта java.lang.String. |
byte, char, double, float, int, long, short | Объект конвертируется в значение с использованием логики оператора ToPrimitive, описанного в ECMA-262. |
boolean | Объект разворачивается, и возникает одна из следующих ситуаций: Если объект – null, он конвертируется в false; Если объект имеет какое-либо другое значение, он конвертируется в true. |
Конвертация из Java в JavaScript
Значения, передаваемые из
Java в
JavaScript, конвертируются так:
- Java-значения byte, char, short, int, long, float и double конвертируются в числа JavaScript.
- Булево значение Java конвертируется в булево значение JavaScript.
- Объект класса netscape.javascript.JSObject конвертируется в оригинальный JavaScript-объект.
- Массивы Java конвертируются в объект псевдо-Array JavaScript; поведение этого объекта похоже на объект Array из JavaScript: Вы можете получить к нему доступ через синтаксис arrayName[index] (где index это целое число) и определить его размер через свойство arrayName.length.
- Java-объект любого иного класса конвертируется в оболочку JavaScript, которая может использоваться для доступа к методам и полям Java-объекта:
o Конвертация этой оболочки в строку вызывает метод
toString объекта-оригинала.
o Конвертация в число вызывает метод
doubleValue, если это возможно, иначе – терпит неудачу.
o Конвертация в
boolean в
JavaScript 1.3 и более поздних версиях возвращает
false, если объект –
null, и
true – в ином случае.
o Конвертация в
boolean в
JavaScript 1.2 и более ранних версиях вызывает метод
booleanValue, если это возможно, иначе – терпит неудачу.
Заметьте, что экземпляры объектов
java.lang.Double и
java.lang.Integer конвертируются в объекты
JavaScript, а не в числа
JavaScript. Аналогично и экземпляры
java.lang.String также конвертируются в объекты
JavaScript, а не в строки
JavaScript.
Java String-объекты также соответствуют
JavaScript-оболочкам. Если вы вызываете метод
JavaScript, который требует строки
JavaScript, и передаёте его этой оболочке, вы получите ошибку. Вместо этого конвертируйте оболочку в строку
JavaScript путём присоединения к ней пустой строки, как показано здесь:
var JavaString = JavaObj.methodThatReturnsAString();
var JavaScriptString = JavaString + "";