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

Remi Forax forax at univ-mlv.fr
Wed Nov 26 23:59:19 UTC 2014


On 11/27/2014 12:37 AM, Tim Fox 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)

BTW, generic info like this one are preserved because javac need them to 
cross compile.
so nashorn could inspect the generic signature and if there is one try 
to do the suitable conversion.

Rémi

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