Re: Updated State of the Specialization

Timo Kinnunen timo.kinnunen at gmail.com
Sat Dec 20 22:18:35 UTC 2014


The workaround works if you do it like this:


class Foo<T>{

void bar(String s){ System.out.println(1); }

void bar(T s){ System.out.println(2); }


public static void main(String... args) {

Foo<String> foo = new Foo<String>();

((Foo<?>) foo).bar("Test");

((Foo)foo).bar((Object)"Test");

}

} 


(Yes, it’s a dirty workaround…)





Hope this helps.





-- 
Have a nice day,
Timo.

Sent from Windows Mail





From: Ali Ebrahimi
Sent: ‎Saturday‎, ‎December‎ ‎20‎, ‎2014 ‎23‎:‎05
To: Timo Kinnunen, Brian Goetz
Cc: valhalla-dev at openjdk.java.net







Ah I forget to say, your proposed workaround is not compatible with current java generics. consider following example:

class Foo<T>{
     void bar(String s){}
     void bar(T s){}

} 



Foo<String> foo = new Foo<String>();


foo.bar((String)"Test"); //fails to compile
foo.bar((Object)"Test");//fails to compile
foo.bar("Test");//fails to compile





Is this a bug or feature? echoing Brain.........







On Sat, Dec 20, 2014 at 11:52 PM, Timo Kinnunen <timo.kinnunen at gmail.com> wrote:




I’m not proposing any particular translation scheme, I’ll leave that to more capable people :) Obviously there has to be one, but I’m coming to this from point of view of how an end-user would be interacting with and using that translation scheme from their code.









-- 
Have a nice day,
Timo.

Sent from Windows Mail





From: Ali Ebrahimi
Sent: ‎Saturday‎, ‎December‎ ‎20‎, ‎2014 ‎19‎:‎36


To: Timo Kinnunen
Cc: valhalla-dev at openjdk.java.net








what is your translation scheme for specialization? is that Brian's Or ...

I'm confused, from your response T instantiated as “valuable” int not int? I'm correct?



On Sat, Dec 20, 2014 at 9:41 PM, Timo Kinnunen <timo.kinnunen at gmail.com> wrote:




It is int, so you end up with two methods in the API which both take the same type and a need to distinguish between them somehow. 




This is analogous to the BigList<BigInteger> example from the previous email. There the problem was about choosing between one method taking a normal BigInteger and another taking an “erasable” BigInteger.




Here the problem is about choosing between one method taking a plain int and another method taking a “valuable” int.









-- 
Have a nice day,
Timo.

Sent from Windows Mail





From: Ali Ebrahimi
Sent: ‎Saturday‎, ‎December‎ ‎20‎, ‎2014 ‎19‎:‎04
To: Timo Kinnunen
Cc: valhalla-dev at openjdk.java.net







What is instantiated type var for T in List<int>? Integer or int




On Sat, Dec 20, 2014 at 3:54 PM, Timo Kinnunen <timo.kinnunen at gmail.com> wrote:




Here an anyfied List version and a demo:




interface List<any T> { 
public void remove(int position);
public void remove(T element);





static void test(List<int> list) {




// calls remove(int position);


list.remove((int) 3);




// calls remove(T element);
list.remove(3);

}

}




The choice of which method to prefer with the plain, cast-less version is somewhat arbitrary. My rationale for preferring it like this rather than the other way around is that the specialized type is more interesting. Thus the compiler should make calling methods taking one as easy as possible.

-- 
Have a nice day,
Timo.

Sent from Windows Mail





From: Ali Ebrahimi
Sent: ‎Saturday‎, ‎December‎ ‎20‎, ‎2014 ‎0‎:‎53
To: Timo Kinnunen
Cc: Brian Goetz, valhalla-dev at openjdk.java.net







As long as I know, we currently have List<E> and We try to specialize (or any-fy) that.
How your solution handle List<int> case?





On Sat, Dec 20, 2014 at 2:15 AM, Timo Kinnunen <timo.kinnunen at gmail.com> wrote:
Hi,


I’m not sure Peeling is necessary. The reason is that the problem it’s trying to solve already exists in the current Java and it has workarounds too. Here’s a demonstration with three ListLike<T> adaptations and the workarounds:


interface SmallList<T> {

public void remove(short position);

public void remove(T element);

}

interface MediumList<T> {

public void remove(int position);

public void remove(T element);

}

interface BigList<T> {

public void remove(BigInteger position);

public void remove(T element);

}


public class Workaround {

@SuppressWarnings({ "rawtypes", "unchecked" })

static void method(SmallList<Short> smallList, MediumList<Integer> mediumList, BigList<BigInteger> bigList) {


smallList.remove((short) 3);

smallList.remove((Short) (short) 3);


mediumList.remove(3);

mediumList.remove((Integer) 3);


((BigList<?>) bigList).remove(BigInteger.valueOf(3));

((BigList) bigList).remove((Object) BigInteger.valueOf(3));

}

}


For the record, none of the workarounds feel “correct” to me, although the int/Integer pair gets close.


Rather than Peeling, what I think is needed is to streamline overload selection so that the specialized methods are selected whenever possible and the non-specialized methods can be manually selected with extra casts, like this:



smallList.remove((short) 3);

smallList.remove(3);




mediumList.remove((int) 3);

mediumList.remove(3);




bigList.remove((BigInteger) BigInteger.valueOf(3));

bigList.remove(BigInteger.valueOf(3));




--
Have a nice day,
Timo.

Sent from Windows Mail





From: Brian Goetz
Sent: ‎Friday‎, ‎December‎ ‎19‎, ‎2014 ‎22‎:‎31
To: valhalla-dev at openjdk.java.net







I've updated the State of the Specialization here:
   http://cr.openjdk.java.net/~briangoetz/valhalla/specialization.html

The old version is here:
   http://cr.openjdk.java.net/~briangoetz/valhalla/specialization-1.html


More information about the valhalla-dev mailing list