Bug in javac -- generic extension methods

Brian Goetz brian.goetz at oracle.com
Fri Feb 4 07:49:06 PST 2011


So, this turned out to be pilot error -- sorry.  The latest patch to 
javah addresses the downstream failure I was seeing as well.  Back to 
our regularly scheduled bikeshed painting.

On 2/3/2011 5:38 PM, Brian Goetz wrote:
> If you clone the tip of
> http://hg.openjdk.java.net/lambda/collections
>
> (which is probably identical to http://hg.openjdk.java.net/lambda/lambda
> now, if that's easier), and apply the following two patches:
>
> Patch 1: force -source and -target 8 when building jdk
>
> diff -r bbfd69ea9c15 -r 73ca5d37cf1f make/common/shared/Defs-control.gmk
> --- a/make/common/shared/Defs-control.gmk Wed Jan 05 10:24:57 2011 +0000
> +++ b/make/common/shared/Defs-control.gmk Thu Feb 03 17:01:04 2011 -0500
> @@ -89,9 +89,9 @@
> dummy := $(shell $(MKDIR) -p $(TEMP_DIR))
>
> # The language version we want for this jdk build
> -SOURCE_LANGUAGE_VERSION=7
> +SOURCE_LANGUAGE_VERSION=8
> # The class version we want for this jdk build
> -TARGET_CLASS_VERSION=7
> +TARGET_CLASS_VERSION=8
>
>
> Patch 2: some extension methods on Collection and List (attached,
> modified Collection and List, creates SAM types for Predicate, Mapper,
> Reducer, and an implementations class SerialEagerCollections.)
>
>
> When you build the jdk project, all the implementations of List fail due
> to the absence of map(), which is the only generic method of the ones
> added to Collection/List:
>
> /opt/jdk160/bin/java -XX:-PrintVMOptions -XX:+UnlockDiagnosticVMOptions
> -XX:-LogV
> MOutput -client -Xmx896m -Xms128m -XX:PermSize=32m -XX:MaxPermSize=160m
> -Xbootcla
> sspath/p:/home/brian/work/lambda/lambda-libs/build/linux-i586/langtools/dist/boot
>
> strap/lib/javac.jar -jar
> /home/brian/work/lambda/lambda-libs/build/linux-i586/lan
> gtools/dist/bootstrap/lib/javac.jar -source 8 -target 8 -encoding ascii
> -Xbootcla
> sspath:/home/brian/work/lambda/lambda-libs/build/linux-i586/classes
> -sourcepath /
> home/brian/work/lambda/lambda-libs/build/linux-i586/gensrc:../../../src/solaris/c
>
> lasses:../../../src/share/classes -d
> /home/brian/work/lambda/lambda-libs/build/li
> nux-i586/classes
> @/home/brian/work/lambda/lambda-libs/build/linux-i586/tmp/java/j
> ava.lang/java/.classes.list.filtered
> ../../../src/share/classes/java/util/ArrayList.java:102: ArrayList is
> not abstrac
> t and does not override abstract method <T>map(Mapper<? super E#2,T>) in
> List
> public class ArrayList<E> extends AbstractList<E>
> ^
> where T,E#1,E#2 are type-variables:
> T extends Object declared in method <T>map(Mapper<? super E#1,T>)
> E#1 extends Object declared in interface List
> E#2 extends Object declared in class ArrayList
> ../../../src/share/classes/java/util/ArrayList.java:924:
> ArrayList.SubList is not
> abstract and does not override abstract method <T>map(Mapper<? super
> E#2,T>) in
> List
> private class SubList extends AbstractList<E> implements RandomAccess {
> ^
> where T,E#1,E#2 are type-variables:
> T extends Object declared in method <T>map(Mapper<? super E#1,T>)
> E#1 extends Object declared in interface List
> E#2 extends Object declared in class ArrayList
> ../../../src/share/classes/java/util/AbstractList.java:613: SubList is
> not abstra
> ct and does not override abstract method <T>map(Mapper<? super E#2,T>)
> in List
> class SubList<E> extends AbstractList<E> {
> ^
> where T,E#1,E#2 are type-variables:
> T extends Object declared in method <T>map(Mapper<? super E#1,T>)
> E#1 extends Object declared in interface List
> E#2 extends Object declared in class SubList
> ../../../src/share/classes/java/util/Arrays.java:2833: ArrayList is not
> abstract
> and does not override abstract method <T>map(Mapper<? super E#2,T>) in List
> private static class ArrayList<E> extends AbstractList<E>
> ^
> where T,E#1,E#2 are type-variables:
> T extends Object declared in method <T>map(Mapper<? super E#1,T>)
> E#1 extends Object declared in interface List
> E#2 extends Object declared in class ArrayList
> ../../../src/share/classes/java/util/Collections.java:3178: EmptyList is
> not abst
> ract and does not override abstract method <T>map(Mapper<? super E#2,T>)
> in List
> private static class EmptyList<E>
> ^
> where T,E#1,E#2 are type-variables:
> T extends Object declared in method <T>map(Mapper<? super E#1,T>)
> E#1 extends Object declared in interface List
> E#2 extends Object declared in class EmptyList
> ../../../src/share/classes/java/util/Collections.java:3348:
> SingletonList is not
> abstract and does not override abstract method <T>map(Mapper<? super
> E#2,T>) in L
> ist
> private static class SingletonList<E>
> ^
> where T,E#1,E#2 are type-variables:
> T extends Object declared in method <T>map(Mapper<? super E#1,T>)
> E#1 extends Object declared in interface List
> E#2 extends Object declared in class SingletonList
>
>
>
>
>


More information about the lambda-dev mailing list