@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.

Reply via email to