@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]>
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].
> 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/CAPVRV7f%2B4eRXykaK%3D-D9mqNBgcfe-ziyKUoHqP-y5eNyA3PAOg%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to