Fwd: jsinterop woes: Part 1: instanceof function in generics casting

已查看 95 次
跳至第一个未读帖子

Vassilis Virvilis

未读,
2017年6月24日 11:53:052017/6/24
收件人 google-web-tool...@googlegroups.com
Originally posted in gwt-users.

Two questions:
  1. Do you want me to report it as a bug somewhere? and where that would be?
  2. I have two more. Do you want me to post them here or this is not the right place to post at all?


---------- Forwarded message ----------
From: Vassilis Virvilis <vas...@gmail.com>
Date: Fri, Feb 24, 2017 at 2:26 PM
Subject: jsinterop woes: Part 1: instanceof function in generics casting
To: google-web-toolkit@googlegroups.com


Hi,

again I don't know if this is a bug but it hurts my style

D3 defines d3.scale.ordinal as both a function and an object. $wnd.d3.scale.ordinal returns function() in the browser's console though


   @JsType(isNative = true, name = "ordinal")
      public static class Ordinal {
           /** @todo TODO: this crashes. Why? */
           public native <I, O> O range(I[] values);       // this doesn't work
           //public native <I> Ordinal range(I[] values); // this works
      }

I want the generic type because then I can put it in a base class and share some code.

I am using it like this
D3.Scale.Ordinal color = D3.Scale.ordinal().range(new String[] {"#98abc5", "#8a89a6"});

Here is the javascript exception:

Error: java.lang.ClassCastException
    at java_lang_ClassCastException_ClassCastException__V.java_lang_Throwable_createError__Ljava_lang_String_2Ljava_lang_Object_2 [as package_private$java_lang$createError__Ljava_lang_String_2Ljava_lang_Object_2] (dashboard-0.js:7245)
    at java_lang_ClassCastException_ClassCastException__V.java_lang_Throwable_initializeBackingError__V [as private$java_lang_Throwable$initializeBackingError__V] (dashboard-0.js:7300)
    at java_lang_ClassCastException_ClassCastException__V.java_lang_Throwable_Throwable__V (dashboard-0.js:7133)
    at java_lang_ClassCastException_ClassCastException__V.java_lang_Exception_Exception__V (dashboard-0.js:7381)
    at java_lang_ClassCastException_ClassCastException__V.java_lang_RuntimeException_RuntimeException__V (dashboard-0.js:29724)
    at java_lang_ClassCastException_ClassCastException__V (dashboard-0.js:57274)
    at javaemul_internal_InternalPreconditions_checkCriticalType__ZV (dashboard-0.js:72135)
    at javaemul_internal_InternalPreconditions_checkType__ZV (dashboard-0.js:72342)
    at com_google_gwt_lang_Cast_castToNative__Ljava_lang_Object_2Lcom_google_gwt_core_client_JavaScriptObject_2Ljava_lang_Object_2 (dashboard-0.js:707)   

In
function com_google_gwt_lang_Cast_castToNative__Ljava_lang_Object_2Lcom_google_gwt_core_client_JavaScriptObject_2Ljava_lang_Object_2(src_0, jsType){
  com_google_gwt_lang_Cast_$clinit__V();
  javaemul_internal_InternalPreconditions_checkType__ZV(com_google_gwt_lang_Cast_jsEquals__Ljava_lang_Object_2Ljava_lang_Object_2Z(src_0, null) || com_google_gwt_lang_Cast_jsinstanceOf__Ljava_lang_Object_2Lcom_google_gwt_core_client_JavaScriptObject_2Z(src_0, jsType));
  return src_0;
}

Arguments:
  • src_0:
    • passed:
    • evaluated: function scale(x)
  • jsType:
    • passed: $wnd.scale.ordinal
    • evaluated: function anonymous()
The reason it fails is that
function com_google_gwt_lang_Cast_jsinstanceOf__Ljava_lang_Object_2Lcom_google_gwt_core_client_JavaScriptObject_2Z(obj, jsType){
  com_google_gwt_lang_Cast_$clinit__V();
  return obj && (jsType && obj instanceof jsType);
}

obj is src_0 != null and jsType = function anonymous() != null but (obj instanceof jsType) === false

Any idea about that?

--
Vassilis Virvilis



--
Vassilis Virvilis

Roberto Lublinerman

未读,
2017年6月24日 20:24:292017/6/24
收件人 google-web-tool...@googlegroups.com
The declaration 

  package somepackage;

  @JsNative(isTrue, name = "ordinal") 
  class Ordinal {
  ....
  }

effectively says that there is a native type "somepackage.ordinal", which d3.ordinal is not.

You can model it as a native interface for example where there is not such expectation.

So as I understand your report this is not a bug but just an error in modellin

--
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+unsu...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-web-toolkit-contributors/CAKbOjEx1v%3D-%3DVHd0Z5pcgTbKTPzFktR7nxoCx2Sr9yutZHtxiw%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Vassilis Virvilis

未读,
2017年6月25日 07:24:402017/6/25
收件人 google-web-tool...@googlegroups.com
Ηι,

thanks for answering

d3.ordinal does not exist as you said. However d3.scale.ordinal exists and that part works great.

in d3 ordinal is both a function ordinal() which returns an ordinal instance and an object with more methods such as range() which is the crux of my issue.

The problem there is that
    • public native <I, O> O range(I[] values);       // this doesn't work
    • // public native <I> Ordinal range(I[] values); // this works
    I would like to use the first definition because it allows reusing some code between different scales. Otherwise I have to copy-paste the range() method multiple times instead of put it in a base class.

    The problem is on the exceptions generated by the attempting casting.

    As you said this may not be a bug but not for the reason you mentioned.

    So the question remains: Should I report it as an issue?

       Vassilis



    For more options, visit https://groups.google.com/d/optout.



    --
    Vassilis Virvilis

    Thomas Broyer

    未读,
    2017年6月25日 10:35:312017/6/25
    收件人 GWT Contributors


    On Sunday, June 25, 2017 at 1:24:40 PM UTC+2, Vassilis Virvilis wrote:
    Ηι,

    thanks for answering

    d3.ordinal does not exist as you said. However d3.scale.ordinal exists and that part works great.

    But it is not a type, so you cannot use 'instanceof' on it.
     
    in d3 ordinal is both a function ordinal() which returns an ordinal instance and an object with more methods such as range() which is the crux of my issue.

    The problem there is that
    • public native <I, O> O range(I[] values);       // this doesn't work
    • // public native <I> Ordinal range(I[] values); // this works
    I would like to use the first definition because it allows reusing some code between different scales. Otherwise I have to copy-paste the range() method multiple times instead of put it in a base class.

    In Java, generics are more or less syntactic sugar for using the erased type and casting values. So when using the first one, GWT will, when used with O==Ordinal, generate a cast from Object to Ordinal, which IIUC is what's causing the error, because your JsType is not a type that can be checked (a cast is translated in JS to a type-check using 'instanceof').
     
    The problem is on the exceptions generated by the attempting casting.

    As you said this may not be a bug but not for the reason you mentioned.

    So the question remains: Should I report it as an issue?

    I would say no. Your @JsType is wrong. You should either use an interface with @JsType(isNative=true, name="?", namespace=JsPackage.GLOBAL), or if you want to use fields use a class with @JsType(isNative=true, name="Object", namespace=JsPackage.GLOBAL) 

    Vassilis Virvilis

    未读,
    2017年6月25日 11:23:542017/6/25
    收件人 google-web-tool...@googlegroups.com
    Hm...

    For me this d3 ordinal thing like implementing the () operator in c++. Is it a function with members and methods or is it an object with the ability to be called as a function?

    Anyway if you and Roberto say it is not a bug then it's not a bug.

    When I revisit my D3 bindings I will explore your proposals - but AFAIK there is no easy solution that resembles the original javascript API. Currently I prefer to copy paste among the inheritance pyramid (there are 2 or 3 subtypes) and have a create() method instead of ordinal() that generates the object.

    If there is no objection I will post another stumbling block I encountered in my jsinterop journey.


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

    For more options, visit https://groups.google.com/d/optout.



    --
    Vassilis Virvilis

    Vassilis Virvilis

    未读,
    2017年6月25日 11:52:102017/6/25
    收件人 google-web-tool...@googlegroups.com
     I was not remembering correctly and my last comment was off. I am not using a create() method. So the editorial correction is

     s/and have a create() method instead of ordinal() that generates the object//g

     

    To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit-contributors+unsu...@googlegroups.com.



    --
    Vassilis Virvilis



    --
    Vassilis Virvilis
    回复全部
    回复作者
    转发
    0 个新帖子