Subclasses of JavaScriptObject represent a view of a JavaScript object
from Java. Such classes must conform to a number of restrictions so
that the compiler can implement them. This page lists those restrictions.
In the following, "JSO class" means any subclass of
JavaScriptObject
. Rationales are written like
this.
- All instance methods on JSO classes must be one of: explicitly
final, a member of a final class, or private. Methods of JSO classes
cannot be overridden, because calls to such methods could require
dynamic dispatch.
- JSO classes cannot implement interfaces that define
methods. This prevents virtual calls that would arise by
upcasting to the interface and then calling through the interface.
The programmer should instead use a wrapper, for example using
Comparator
instead of implementing
Comparable
.
- No instance methods on JSO classes may override another
method. This catches accidents where JSO itself did not finalize
some method from its superclass.
- JSO classes cannot have instance fields. The fields would
have no place to live in web mode. Programmers should instead make
an explicit wrapper class and put the fields there.
- Nested JSO classes must be static. The implicit
this
fields of a non-static inner class has the same
problems as an explicit field.
- "new" operations cannot be used with JSO classes. This
avoids ever being able to try to instantiate JSO objects using the
new keyword. New JSO instances can only come from JSNI, as in
previous versions of GWT.
- Every JSO class must have precisely one constructor, and it must
be protected, empty, and no-argument.