| <html> | |
| <head> | |
| <meta http-equiv="content-type" content="text/html; charset=UTF-8"> | |
| <title>Restrictions on long values with JSNI</title> | |
| </head> | |
| <body> | |
| <p>The Java <code>long</code> type cannot be represented in JavaScript | |
| as a numeric type, so GWT emulates it using an opaque data structure. | |
| This means that JSNI methods cannot process a <code>long</code> as a | |
| numeric type. The compiler therefore disallows, by default, directly | |
| accessing a <code>long</code> from JSNI: JSNI methods cannot have | |
| <code>long</code> as a parameter type or a return type, and they | |
| cannot access a <code>long</code> using a JSNI reference. If you | |
| find yourself wanting to pass a <code>long</code> into or out of a | |
| JSNI method, here are some options: | |
| <ol> | |
| <li> For numbers that fit into type <code>double</code>, use type | |
| <code>double</code> instead of type <code>long</code>. | |
| <li> For computations that require the full <code>long</code> | |
| semantics, rearrange the code so that the computations happen in | |
| Java instead of in JavaScript. That way they will use the | |
| <code>long</code> emulation. | |
| <li> For values meant to be passed through unchanged to Java code, | |
| wrap the value in a <code>Long</code>. There are no restrictions | |
| on type <code>Long</code> with JSNI methods. | |
| <li> If you are sure you know what you are doing, you can add the | |
| annotation | |
| <code>com.google.gwt.core.client.UnsafeNativeLong</code> to the | |
| method. The compiler will then allow you to pass a | |
| <code>long</code> into and out of JavaScript. It will still be an | |
| opaque data type, however, so the only thing you will be able to | |
| do with it will be to pass it back to Java. | |
| </ol> | |
| </body> | |
| </html> |