Bug in javac -- generic extension methods

Brian Goetz brian.goetz at oracle.com
Thu Feb 3 14:38:31 PST 2011


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


-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: extn-patch
Url: http://mail.openjdk.java.net/pipermail/lambda-dev/attachments/20110203/457eee4d/attachment-0001.ksh 


More information about the lambda-dev mailing list