@Ray Cromwell thank you for your answer. One last question regarding the
creation of JSInterop objects.
Is it @JsType(prototype="SomeJsObject") or
@JsType(prototype="$wnd.SomeJsObject") ?
Consider an interface
@JsType
interface Test {
void do();
}
How do I instantiate such an interface? The only way I see is be using a
static inner class on the interface which contains a static JSNI method
that returns a new instance. This seems to be a little bit complicated. Is
this the correct way to do?
Am Dienstag, 28. Oktober 2014 19:37:15 UTC+1 schrieb Ray Cromwell:
>
> @JsType(prototype="Window") means that "x instanceof Window" will return
> false if the underlying object isn't a Window. That is, the GWT compiler
> generates a JS instanceof operator with the specified prototype.
>
> Otherwise, @JsType interfaces are treated like JavaScriptObject overlay
> types as far as castability/instanceof is concerned.
>
> isNative is just documentation for now, but says that the underlying
> prototype is a browser built-in as opposed to a hand written user supplied
> JS prototype. Native prototypes have restrictions that pure-JS ones don't.
>
> @JsType(prototype="...") will also trigger an annotation processor in the
> future that generates a stub _Prototype for extending, e.g.
>
> @JsType(prototype="HTMLDivElement")
> interface HTMLDivElement extends HTMLElement { ... }
>
> will generate a
>
> @PrototypeOfJsType(HTMLDivElement.class)
> class HtmlDivElement_Prototype extends HTMLElement_Prototype { ... }
>
> This makes it possible to subclass JS objects, e.g.
>
> class MyDivElement extends HTMLDivElement_Prototype { ... }
>
>
> On Tue Oct 28 2014 at 9:17:55 AM confile <[email protected]
> <javascript:>> wrote:
>
>> Okay great. But what is the difference between the following?
>>
>> *@JsType(prototype="Window"**)* and *@JsType *
>>
>> Also could you please explain when to use isNative = true?
>>
>>
>>
>>
>> Am Dienstag, 28. Oktober 2014 17:06:47 UTC+1 schrieb Ray Cromwell:
>>>
>>> GWT.create() doesn't work to create Js interfaces. It's part of the
>>> GWT deferred binding system and can only be bound to concrete Java
>>> subtypes. (GWT.create uses the 'new' operator)
>>>
>>> JsInterop is going to move towards Java8 syntax for the use case you
>>> describe, e.g
>>>
>>> @JsType
>>> interface Window {
>>> static Window get() { return js("window"); }
>>> }
>>>
>>>
>>>
>>> On Tue, Oct 28, 2014 at 8:33 AM, confile
>>>
>> <[email protected]> wrote:
>>> > What is the difference in using the following?
>>> >
>>> > @JsType(prototype="Window") and @JsType
>>> >
>>> > It does not become very clear from the documentation.
>>> >
>>> > Here is the interface I implemented:
>>> >
>>> > @JsType(prototype="Window")
>>> >
>>> > public interface MyWindow {
>>> >
>>> >
>>> > public static abstract class Statics {
>>> >
>>> > public static native MyWindow create() /*-{
>>> >
>>> > var w = $wnd;
>>> >
>>> > return w;
>>> >
>>> > }-*/;
>>> >
>>> > }
>>> >
>>> > void alert(String msg);
>>> >
>>> > }
>>> >
>>> >
>>> > When I want to use the interface I have to do: MyWindow w =
>>> > MyWindow.Statics.create();
>>> >
>>> > I also would expect that the following should work too: MyWindow w =
>>> > GWT.create(MyWindow.class);
>>> >
>>> > The compiler throws an error in the later case:
>>> >
>>> > [ERROR] Line 46: Rebind result 'test.client.MyWindow' must be a class
>>> >
>>> > Unification traversed 735 fields and methods and 538 types. 7
>>> are
>>> > considered part of the current module and 7 had all of their fields
>>> and
>>> > methods traversed.
>>> >
>>> > [ERROR] Compiler returned false
>>> >
>>> >
>>> > Two questions:
>>> >
>>> > 1. When do I use or do I not use the prototype and isNative attribute
>>> of
>>> > @JsType?
>>> >
>>> > 2. Do I use the correct way to instantiate a JSInterop Interface?
>>> >
>>> >
>>> >
>>> >
>>> >
>>> > Am Sonntag, 5. Oktober 2014 08:32:26 UTC+2 schrieb Ray Cromwell:
>>> >>
>>> >> Using default methods in Java8 is exactly how we plan to allow
>>> >> specifying method bodies without using JSOs. We are also going to
>>> >> introduce a new annotation, @JsFinal to declare these methods final
>>> >> (which you can't do on interfaces) to make it a compile time error
>>> for
>>> >> subclasses to override them.
>>> >>
>>> >> Why? One of the reasons why JSOs are efficient is that they are not
>>> >> polymorphic, and essentially turn into static method calls, e.g.
>>> >>
>>> >> getState() is rewritten as getState(SwitchElement this$static) /*-{
>>> >> return this$static.bootstrapSwitch("state"); }-*/; which is
>>> >> inlineable by the compiler.
>>> >>
>>> >> Polymorphic methods are not inlineable and if there is a concrete
>>> >> implementor, it forces the compiler to insert a trampoline, e.g
>>> >> .
>>> >>
>>> >> @JsType
>>> >> interface JsArray<T> {
>>> >> default <T> get(int x) { return js("this[$0]", x); }
>>> >> }
>>> >>
>>> >> If we didn't have @JsFinal, and someone did class Blah implements
>>> >> JsArray { ... }, it would slow down every single JsArray call in the
>>> >> entire program, because the compiler has to emit code like this:
>>> >>
>>> >> jsArray.get ? jsArray.get(i) : this[i];
>>> >>
>>> >> That is, it has to check to see if the method is implemented and call
>>> >> it, otherwise fall back to the default.
>>> >>
>>> >>
>>> >> This is why the full JsInterop will require Java8, because it makes
>>> >> syntax so much better, and without it, things get verbose and
>>> >> boilerplatey.
>>> >>
>>> >> Java8 support is very close to landing. After that, a bunch of
>>> >> JsInterop changes will go in. Then Elemental 2.0 will follow on top
>>> of
>>> >> that which implements all of the code browser APIs you see at
>>> >> html5index.org
>>> >>
>>> >>
>>> >> On Sat, Oct 4, 2014 at 3:29 PM, Cristian Rinaldi <[email protected]>
>>> >> wrote:
>>> >> > +Ray Cromwell:
>>> >> > Suppose the following definition:
>>> >> >
>>> >> > @JsType(prototype = "jQuery")
>>> >> > public interface JQueryElement {
>>> >> > JQueryElement append(JQueryElement element);
>>> >> >
>>> >> > @JsProperty
>>> >> > JQueryElement html();
>>> >> >
>>> >> > void data(String key, String value);
>>> >> >
>>> >> > Object val();
>>> >> >
>>> >> > void on(String event,
>>> >> > com.workingflows.js.jscore.client.api.Function<?,?> fn);
>>> >> >
>>> >> > void attr(String attr, Object value);
>>> >> > }
>>> >> >
>>> >> > Now suppose that there is an element called SwitchElement, the item
>>> is a
>>> >> > JQueryElement but has a particual implementation of a method, for
>>> >> > example:
>>> >> >
>>> >> > public class SwitchElement extends JavaScriptObject {
>>> >> >
>>> >> > protected SwitchElement() {
>>> >> > }
>>> >> >
>>> >> > public final native boolean getState()/*-{
>>> >> > return this.bootstrapSwitch("state");
>>> >> > }-*/;
>>> >> >
>>> >> > public final native void setState(boolean state)/*-{
>>> >> > this.bootstrapSwitch("state", state);
>>> >> > }-*/;
>>> >> > }
>>> >> >
>>> >> > The problem is, if the JQueryElement interface is implemented, all
>>> >> > methods
>>> >> > must be implemented. In fact, the implementation of JQueryElement
>>> is
>>> >> > performed by the compiler, and I have no access to that
>>> implentación.
>>> >> >
>>> >> > 1) The solution can be: define an Java8 interface with methods
>>> >> > implemented
>>> >> > by default?
>>> >> >
>>> >> > 2) It is possible to access a Prototype implementation of
>>> JQueryElement,
>>> >> > by
>>> >> > example:
>>> >> >
>>> >> > public class SwitchElement extends JQueryElement.Prototype{
>>> >> > protected SwitchElement() {
>>> >> > }
>>> >> >
>>> >> > public final native boolean getState()/*-{
>>> >> > return this.bootstrapSwitch("state");
>>> >> > }-*/;
>>> >> >
>>> >> > public final native void setState(boolean state)/*-{
>>> >> > this.bootstrapSwitch("state", state);
>>> >> > }-*/;
>>> >> >
>>> >> > }
>>> >> >
>>> >> > But for this, it is necessary to use APT or the JsType generation
>>> >> > process,
>>> >> > is performed by APT.
>>> >> > I'm right, or very far from reality.
>>> >> >
>>> >> > :)
>>> >> >
>>> >> >
>>> >> > El sábado, 4 de octubre de 2014 15:24:19 UTC-3, Ray Cromwell
>>> escribió:
>>> >> >>
>>> >> >> Yes, but it will require Java8, which allows interfaces to contain
>>> >> >> static methods. Here's how you'll do it soon when the Java8 stuff
>>> >> >> lands:
>>> >> >>
>>> >> >> @JsType
>>> >> >> public interface ImageUtils {
>>> >> >> public static Texture loadTexture(String url) { return
>>> >> >> js("$wnd.THREE.ImageUtils.loadTexture($0)", url); }
>>> >> >> }
>>> >> >>
>>> >> >> ImageUtils.loadTexture(url);
>>> >> >>
>>> >> >>
>>> >> >>
>>> >> >> On Sat, Oct 4, 2014 at 8:18 AM, confile <
>>> [email protected]>
>>> >> >> wrote:
>>> >> >> > Consider the following static JavaScript function:
>>> >> >> >
>>> >> >> > THREE.ImageUtils = {
>>> >> >> > loadTexture: function (url) { ... }
>>> >> >> >
>>> >> >> > }
>>> >> >> >
>>> >> >> > The way I use to create the static function with JsInterop is to
>>> >> >> > create
>>> >> >> > an
>>> >> >> > interface for ImageUtils and then create an inner abstract class
>>> >> >> > MyStatic
>>> >> >> > which contains the static methods implemented with JSNI.
>>> >> >> >
>>> >> >> > Here is an example of the above class:
>>> >> >> >
>>> >> >> > @JsType
>>> >> >> > public interface ImageUtils {
>>> >> >> >
>>> >> >> > public static abstract class MyStatic {
>>> >> >> >
>>> >> >> > public static native Texture create(String url) /*-{
>>> >> >> > return new $wnd.THREE.ImageUtils.loadTexture(url);
>>> >> >> > }-*/;
>>> >> >> > }
>>> >> >> >
>>> >> >> > }
>>> >> >> >
>>> >> >> >
>>> >> >> > I don't think this is the best solution. Is there a better way
>>> to
>>> >> >> > handle
>>> >> >> > static functions with JsInterop?
>>> >> >> >
>>> >> >> > --
>>> >> >> > You received this message because you are subscribed to the
>>> Google
>>> >> >> > Groups
>>> >> >> > "GWT Contributors" group.
>>> >> >> > To unsubscribe from this group and stop receiving emails from
>>> it,
>>> >> >> > send
>>> >> >> > an
>>> >> >> > email to
>>> >> >> > [email protected].
>>> >> >> > To view this discussion on the web visit
>>> >> >> >
>>> >> >> >
>>> >> >> > https://groups.google.com/d/msgid/google-web-toolkit-
>>> contributors/8f6cf42a-2910-4536-a2f7-1ae2d55422ac%40googlegroups.com.
>>> >> >> > For more options, visit https://groups.google.com/d/optout.
>>> >> >
>>> >> > --
>>> >> > You received this message because you are subscribed to the Google
>>> >> > Groups
>>> >> > "GWT Contributors" group.
>>> >> > To unsubscribe from this group and stop receiving emails from it,
>>> send
>>> >> > an
>>> >> > email to google-web-toolkit-contributors+unsubscribe@
>>> googlegroups.com.
>>> >> > To view this discussion on the web visit
>>> >> >
>>> >> > https://groups.google.com/d/msgid/google-web-toolkit-
>>> contributors/51be727d-0003-425b-9040-bd3c8529ddd1%40googlegroups.com.
>>> >> >
>>> >> > For more options, visit https://groups.google.com/d/optout.
>>> >
>>> > --
>>> > You received this message because you are subscribed to the Google
>>> Groups
>>> > "GWT Contributors" group.
>>> > To unsubscribe from this group and stop receiving emails from it, send
>>> an
>>> > email to [email protected].
>>>
>>> > To view this discussion on the web visit
>>> > https://groups.google.com/d/msgid/google-web-toolkit-
>>> contributors/e40493a9-b890-47b0-ad31-5cd4e9c28a46%40googlegroups.com.
>>> >
>>> > For more options, visit https://groups.google.com/d/optout.
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "GWT Contributors" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected]
>> <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/google-web-toolkit-contributors/94cce332-a8c7-4790-98a8-e752a5fd3dd8%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/google-web-toolkit-contributors/94cce332-a8c7-4790-98a8-e752a5fd3dd8%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
--
You received this message because you are subscribed to the Google Groups "GWT
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-web-toolkit-contributors/4fc7db2a-19ce-4518-8d32-a6d18d0b234c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.