Forcing elements of List to be converted as java.lang.Long

Tim Fox timvolpe at gmail.com
Thu Nov 27 11:43:57 UTC 2014


Great, that works.

And it's a lot faster than manually converting the elements of the list 
in JS before sending it to Java :)

On 27/11/14 11:24, Attila Szegedi wrote:
> Thinking of it, yes, there is:
>
> 	var asList = java.util.Arrays.asList;
> 	var LongType = Java.type("java.lang.Long[]");
>
> then:
>
> 	asList(Java.to(arr, LongType))
>
> Attila.
>
> On Nov 27, 2014, at 12:37 AM, Tim Fox <timvolpe at gmail.com> wrote:
>
>> Hi Attila,
>>
>> I understand the generic type info is erased, but my question was whether there is any way I can "force" Nashorn to convert the elements as Long rather than Integer when doing the conversion, e.g. using some special Nashorn specific syntax, e.g.
>>
>> var arr = [123];
>> arr.forceConversionAsLong = true; // A contrived example but you get the point :)
>> obj.foo(arr);
>>
>> (or whatever)
>>
>>
>> On 26/11/14 21:50, Attila Szegedi wrote:
>>> I don't think so. As the types are erased at run time all we see is a method with signature foo(List list). I think if you tried to add two methods to a class:
>>>
>>>      public void foo(List<Long> x) { }
>>>      public void foo(List<Integer> x) { }
>>>
>>> then javac would refuse to compile it saying that both have the same erasure.
>>>
>>> Attila.
>>>
>>> On Nov 26, 2014, at 10:45 PM, Tim Fox <timvolpe at gmail.com> wrote:
>>>
>>>> Hello folks,
>>>>
>>>> I have a Java method:
>>>>
>>>> public void foo(List<Long> list) {
>>>>   System.out.println("elem0 is " + list.get(0));
>>>> }
>>>>
>>>> Which I call from JS with a JS array:
>>>>
>>>> obj.foo([123]);
>>>>
>>>> This results in a ClassCastException as Nashorn converts the JS Array into a java.util.List instance which contains a java.lang.Integer element (not java.lang.Long)
>>>>
>>>> Is there any way to force Nashorn to convert the array elements as Longs not Integers?
>>>>
>>>> Thanks.



More information about the nashorn-dev mailing list