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.