Defaut methods are not visible if -source 1.7 is set
Remi Forax
forax at univ-mlv.fr
Tue Oct 29 11:37:37 PDT 2013
On 10/29/2013 07:19 PM, Joe Darcy wrote:
> On 10/29/2013 10:48 AM, Brian Goetz wrote:
>> We discussed this extensively at some point; its not as simple as
>> this, though I admit the details are paging in slowly.
>>
>> IIRC, the root problem is this: you have a class
>>
>> class Foo extends List { }
>>
>> that you want to compile with the 1.8 javac but with -source 1.7.
>> What could happen?
>>
>> 1. You could fail to compile, because the supertype uses language/VM
>> features you don't support. This would be not very nice.
>>
>> 2. You could force the user to implement the default methods, since
>> we can't assume they're inherited. This is also not very nice.
>>
>> 3. We could ignore them.
>>
>> The root problem is that -source 1.7 still exposes 1.8 libraries to
>> the compilation, which is just wrong. What should happen is we
>> should be compiling with the fictitious -platform 1.7, which not only
>> enforces the 1.7 language level, but also puts the 1.7 JDK classes on
>> the bootclasspath.
>>
>> Eventually, modularity was supposed help here. At the time, (3)
>> seemed the least bad alternative. But this is indeed a problem for
>> methods that acquire defaults.
>>
>>> spec shoud be changed to say that adding a default implementation
>>> is not a compatible change
>>
>> There's no way we're doing this to work around a tooling bug.
>
> IMO, the current behavior of javac is the least-bad option.
>
> (The issue before was how AnnotatedElement.isAnnotationPresent should
> be handled. It was a Java SE 5 method on AnnotatedElement that was
> turned into a default. The behavior of javac meant that the method
> "disappeared" from the implementations of the interface, like
> java.lang.Class, for code being compiled under earlier source
> versions. We addressed this by adding back concrete implementations in
> the interface implementations that called back to the default method.
> That means the method appears present in all source versions and we
> still get some sharing of the implementation code.)
Yes I understand the details but I disagree with the premise, it's not
the least bad-option
because it means that Iterator.remove or any abstract method which is
converted from an abstract method to a default method
not working with javac8 -source 1.7.
Default methods are abstract with -source 1.7 is more appealing to me.
>
> There is no specification that governs how a compiler should present
> new-in-8 language features when compiling under a older-than-8 source
> level. More generally, the -source and -target options are not
> required parts of the platform specification, just a convenience to
> developers.
>
> -Joe
>
Rémi
More information about the lambda-spec-experts
mailing list