Please provide default impl for new methods on Collection/Map interfaces
Peter Reilly
peter.kitt.reilly at gmail.com
Thu Sep 20 04:53:42 PDT 2012
You should only get linkage errors if one uses the new methods. (easy to do)
This is the normal behavior when compiling with a newer version of the
the jdk than the running one.
Peter
On Thu, Sep 20, 2012 at 12:43 PM, Aleksey Shipilev
<aleksey.shipilev at oracle.com> wrote:
> I think it is correct to have compile-time error with target=1.6; since
> there you might then get these classes to run in JDK6, and get linkage
> error at runtime. Maurizio should know better.
>
> -Aleksey.
>
> On 09/20/2012 03:37 PM, Peter Reilly wrote:
>> Looking at the code, I see that there are indeed default implementations for
>> these methods.
>>
>> Looking at my build, I see that I was compiling with target=1.6 source=1.6.
>> When I set these to 1.8, the problem goes away.
>>
>> The code should still compile with target=1.6,source=1.6, however I can see
>> that handling of the default methods in this case may be problematic.
>>
>> Thanks for the very quick response!
>>
>> Peter
>>
>>
>> On Thu, Sep 20, 2012 at 12:17 PM, Aleksey Shipilev
>> <aleksey.shipilev at oracle.com> wrote:
>>> Well, I'm puzzled at this point. If your classes are extending
>>> AbstractCollection, they implicitly extend Collection, and Collection
>>> has default methods to be picked up.
>>>
>>> Are you compiling with lambda/lambda javac? Vanilla JDK8 javac would not
>>> work, since it does not know anything about default methods yet.
>>>
>>> -Aleksey.
>>>
>>> On 09/20/2012 03:14 PM, Peter Reilly wrote:
>>>> No problem.
>>>>
>>>> My code extends AbstractCollection and AbstractMap.
>>>>
>>>> The changes I made to them are:
>>>> - i.e. implement Collection.stream, Colleciton.addAll(Stream) and
>>>> similar methods in Map.
>>>>
>>>> Peter
>>>>
>>>> ----------------------------------------
>>>> preilly at mint-Precision-M6400
>>>> ~/Public/hg/lambda/jdk/src/share/classes/java/util $ hg diff .
>>>> diff -r ee96d823b92c src/share/classes/java/util/AbstractCollection.java
>>>> --- a/src/share/classes/java/util/AbstractCollection.java Fri
>>>> Sep 14 16:46:42 2012 -0700
>>>> +++ b/src/share/classes/java/util/AbstractCollection.java Thu
>>>> Sep 20 12:09:48 2012 +0100
>>>> @@ -25,6 +25,8 @@
>>>>
>>>> package java.util;
>>>>
>>>> +import java.util.streams.*;
>>>> +
>>>> /**
>>>> * This class provides a skeletal implementation of the <tt>Collection</tt>
>>>> * interface, to minimize the effort required to implement this interface. <p>
>>>> @@ -75,6 +77,10 @@
>>>> */
>>>> public abstract Iterator<E> iterator();
>>>>
>>>> + public Stream<E> stream() {
>>>> + return null;
>>>> + }
>>>> +
>>>> public abstract int size();
>>>>
>>>> /**
>>>> @@ -345,7 +351,9 @@
>>>> modified = true;
>>>> return modified;
>>>> }
>>>> -
>>>> + public void addAll(Stream<? extends E> c) {
>>>> +// return false;
>>>> + }
>>>> /**
>>>> * {@inheritDoc}
>>>> *
>>>> diff -r ee96d823b92c src/share/classes/java/util/AbstractMap.java
>>>> --- a/src/share/classes/java/util/AbstractMap.java Fri Sep 14
>>>> 16:46:42 2012 -0700
>>>> +++ b/src/share/classes/java/util/AbstractMap.java Thu Sep 20
>>>> 12:09:48 2012 +0100
>>>> @@ -25,6 +25,8 @@
>>>>
>>>> package java.util;
>>>> import java.util.Map.Entry;
>>>> +import java.util.streams.*;
>>>> +import java.util.functions.BiBlock;
>>>>
>>>> /**
>>>> * This class provides a skeletal implementation of the <tt>Map</tt>
>>>> @@ -66,6 +68,10 @@
>>>> */
>>>>
>>>> public abstract class AbstractMap<K,V> implements Map<K,V> {
>>>> + public MapIterator<K,V> iterator() { return null; }
>>>> + public MapStream<K,V> stream() { return null; }
>>>> + public void forEach(BiBlock<? super K, ? super V> block) {}
>>>> + public void addAll(MapStream<? extends K, ? extends V> stream) {}
>>>> /**
>>>> * Sole constructor. (For invocation by subclass constructors, typically
>>>> * implicit.)
>>>>
>>>>
>>>> On Thu, Sep 20, 2012 at 11:31 AM, Aleksey Shipilev
>>>> <aleksey.shipilev at oracle.com> wrote:
>>>>> Hi Peter,
>>>>>
>>>>> On 09/20/2012 01:37 PM, Peter Reilly wrote:
>>>>>> However, while attempting to compile some current code with the jdk8 compiler,
>>>>>> there were a small number of issues with code that implements some java.util
>>>>>> interfaces. The two that my code had problems with were Collection and Map.
>>>>>
>>>>> Can you provide a more concrete example? Was that your custom
>>>>> collections were failing to compile against JDK8?
>>>>>
>>>>>> I worked around this by compiling a custom version of lamdba with the
>>>>>> missing methods getting default implementation in
>>>>>> j.u.AbstractCollection and j.u.AbstractMap.
>>>>>
>>>>> Aha, so your collections were implementing Collection, but not extending
>>>>> AbstractCollection? Which methods you had to add? I see most of the new
>>>>> methods have defaults in Collection.
>>>>>
>>>>> -Aleksey.
>>>>>
>>>>>
>>>>>
>>>
>
More information about the lambda-dev
mailing list