- Language support
- Runtime library support
- Differences between JRE and emulated classes
- Classes that provide similar functionality
GWT supports most of the core Java language syntax and semantics, but there are a few differences you will want to be aware of.
Note: As of GWT 1.5, GWT compiles the Java language syntax that is compatible with J2SE 1.5 or earlier. Versions of GWT prior to GWT 1.5 are limited to Java 1.4 source compatibility. For example, GWT 2.0 supports generics, whereas GWT 1.4 does not.
Intrinsic types: Primitive types (
String, arrays, user-defined classes, etc. are all supported, with a couple of caveats.
int) will not wrap the underlying value as Java specifies. Instead, the resulting value will outside of the legal range for that data type. Operations on
floatare performed as
doubleand will result in more-than-expected precision. Integer division is implemented to explicitly round to the correct value.
longneeds special consideration. Prior to GWT 1.5, the
longvariables an actual range less than the full 64 bits. As of GWT 1.5,
longprimitives are emulated as a pair of 32-bit integers, and work reliably over the entire 64-bit range. Overflow is emulated to match the expected behavior. There are a couple of caveats. Heavy use of
finallyand user-defined exceptions are supported as normal, although
Throwable.getStackTrace()is not meaningfully supported in production mode.
Note: Several fundamental exceptions implicitly produced by the Java VM, most notably
OutOfMemoryError, do not occur in production mode as such. Instead, a
assertstatements are always active in development mode because it’s a great way for GWT libraries to provide lots of helpful error checking while you’re debugging. The GWT compiler removes and ignores all assertions by default, but you can enable them in production mode by specifying the
synchronizedkeyword, it has no real effect. Synchronization-related library methods are not available, including
Object.notifyAll().The compiler will ignore the synchronized keyword but will refuse to compile your code if the
Object’s related synchronization methods are invoked.
Reflection: For maximum efficiency, GWT compiles your Java source into a monolithic script, and does not support subsequent dynamic loading of classes. This and other optimizations preclude general support for reflection. However, it is possible to query an object for its class name using Object.getClass().getName().
Strict Floating-Point: The Java language specification precisely defines floating-point support, including single-precision and double-precision numbers as well as the
strictfpkeyword. GWT does not support the
strictfpkeyword and can not ensure any particular degree of floating-point precision in translated code, so you may want to avoid calculations in client-side code that require a guaranteed level of floating-point precision.
GWT supports only a small subset of the classes available in the Java 2 Standard and Enterprise Edition libraries, as these libraries are quite large and rely on functionality that is unavailable within web browsers. To find out exactly which classes and methods are supported for core Java runtime packages, see the GWT JRE Emulation Reference.
Tip: You will save yourself a lot of frustration if you make sure that you use only translatable classes in your client-side code from the very beginning. To help you identify problems early, your code is checked against the JRE emulation library whenever you run in development mode. As a result, most uses of unsupported libraries will be caught the first time you attempt to run your application. So, run early and often_._
Some specific areas in which GWT emulation differs from the standard Java runtime:
Note: For a list of JRE classes that GWT can translate out of the box, see the GWT JRE Emulation Reference.
In some classes, the functionality of the class is too expensive to be emulated entirely, so a similar routine in another package is provided instead. Here are some commonly used routines that provide a subset of the native JRE functionality:
- com.google.gwt.i18n.client.DateTimeFormat : Supports a subset of
java.util.DateTimeFormat. See examples in the date and number formatting section.
- com.google.gwt.i18n.client.NumberFormat : Supports a subset of
java.util.NumberFormat. See examples in the date and number format section.
- com.google.gwt.user.client.rpc.IsSerializable : A marker class used similarly to
java.io.Serializablefor GWT RPC.
- com.google.gwt.user.client.Timer : A simplified, browser-safe timer class. This class serves the same purpose as
java.util.Timer, but is simplified because of the single-threaded environment.