[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-nashorn-dev
Subject:    Re: Forcing elements of List to be converted as java.lang.Long
From:       Attila Szegedi <attila.szegedi () oracle ! com>
Date:       2014-11-27 14:01:11
Message-ID: C4204112-AD97-4BA7-8C67-3B950B0A1D29 () oracle ! com
[Download RAW message or body]

You're right about that, Rémi. However, even in Java you can twist things with \
unchecked casts so that you pass a List<Object> to this method and force it into a \
ClassCastException, so I'm not sure if us going out of our way to inject a suitable \
conversion would be desired.

On Nov 27, 2014, at 12:59 AM, Remi Forax <forax@univ-mlv.fr> wrote:

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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic