Will JDK 8 support SAM that is Abstract Class ?
Brian Goetz
brian.goetz at oracle.com
Mon Nov 5 11:35:56 PST 2012
> That's exactly what I'm doing to Functional Java. Only static methods
> cause a problem (are static defenders on the radar?). Final methods
> becoming defender methods is a little concerning because they can then
> be overridden.
Static *methods* are on the radar -- but they're not "default methods", since they can't be overridden. But, yes. Though likely not to make the cut for 8.
> All classes, including Object, have a constructor. Object's just
> doesn't do anything.
>
> On Mon, Nov 5, 2012 at 2:52 PM, Boaz Nahum <boaznahum at gmail.com> wrote:
>> Do you think converting adapter class
>>
>> class TransitionHandler {
>>
>> String getName() { return null; }
>>
>> abstract void noTransition();
>> }
>>
>> to interface:
>> interface TransitionHandler {
>>
>> String getName() default { return null; }
>>
>> void noTransition();
>> }
>>
>> abuse the "Defender Methods" idea ? Do you see any problem with this ?
>>
>> And why can't the compiler deduce that no ctor is involved ? (I hope no one
>> plans to add ctor to Object ?)
>>
>> Thanks
>> Boaz
>>
>>
>>
>>
>>
>>
>> On Mon, Nov 5, 2012 at 7:13 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>>
>>> On 11/05/2012 04:08 PM, Boaz Nahum wrote:
>>>> Does it mean that all 'old' inner classes extending adapters cant be
>>>> converted to lambda(assuming converting the adapter to SAM)?
>>>> Please say no: (
>>>
>>> We drop that support because an abstract class has a constructor (at
>>> least one)
>>> that can observe the creation of the lambda so it defeat most of the
>>> optimizations
>>> that the VM can do.
>>>
>>> The other problem was to deal with abstract class with a constructor
>>> that may throw an exception
>>> because again, the construction of the lambda is observable.
>>>
>>> You can still retrofit your code to use lambda using delegation instead
>>> of inheritance.
>>> By example:
>>>
>>> abstract class Foo<T> {
>>> Foo() {
>>> // some side effects
>>> }
>>> public abstract void m(T element);
>>> }
>>>
>>> Foo<String> foo = new Foo<String>() {
>>> public void m(String s) {
>>> // lambda code
>>> }
>>> };
>>>
>>> can be retrofitted to:
>>>
>>> class Foo<T> {
>>> private final Block<? super T> block;
>>> Foo(Block<? super T> block) {
>>> this.block = block;
>>> // some side effects
>>> }
>>> public void m(T element) {
>>> block.apply(element);
>>> }
>>> }
>>>
>>> Foo<String> foo = new Foo<String>((String s) -> {
>>> // lambda code
>>> });
>>>
>>>
>>>>
>>>> Thanks
>>>> Boaz
>>>
>>> Cheers,
>>> Rémi
>>>
>>>> On Nov 5, 2012 5:01 PM, "Reinier Zwitserloot" <reinier at zwitserloot.com>
>>>> wrote:
>>>>
>>>>> It was part of the original plan, but I believe non-interface SAMs have
>>>>> been dropped. I'm guessing because it was difficult to handle the
>>> peculiars
>>>>> of working with MethodHandles and not actually making a new instance of
>>> the
>>>>> SAM type.
>>>>>
>>>>> --Reinier Zwitserloot
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Nov 5, 2012 at 3:41 PM, Boaz Nahum <boaznahum at gmail.com> wrote:
>>>>>
>>>>>> I can't find what the spec is saying, but I remember that Abstract
>>> class
>>>>>> with one abstract method is also SAM.
>>>>>>
>>>>>> Currently in b63 I got java: incompatible types: the target type must
>>> be a
>>>>>> functional interface
>>>>>>
>>>>>> Will it be supported in the future ?
>>>>>>
>>>>>> Thanks
>>>>>> Boaz
>>>>>>
>>>>>>
>>>
>>>
>>>
>>
>
More information about the lambda-dev
mailing list