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] <javascript:>> 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] 
> <javascript:>. 
> >> >> > 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 [email protected] 
> <javascript:>. 
> >> > 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] 
> <javascript:>. 
> > 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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to