Late binding for lamba parameters?
Brian Goetz
brian.goetz at oracle.com
Fri Sep 13 11:28:51 PDT 2013
Or:
http://dl.acm.org/citation.cfm?id=1268247
On 9/13/2013 2:20 PM, Remi Forax wrote:
> On 09/13/2013 08:10 PM, Zhong Yu wrote:
>> We could build a run time dispatcher, for example
>>
>> public class Dispatcher
>> <T> void register(Class<T> type, Consumer<T> handler)...
>> void call(Object obj)...
>>
>> ---
>>
>> Dispatcher processor = new Dispatcher();
>>
>> processor.register(Elem1.class, elem1->{
>> print(elem1.f1);
>> });
>>
>> processor.register(Elem2.class, elem2->{
>> print(elem2.f2);
>> };
>>
>> list.forEach(processor::call);
>>
>> ---
>>
>> the syntax of registration is pretty close to method declaration syntax.
>>
>> The dispatcher requires some effort to mimic static method invocation
>> semantics, e.g. applicable through subtyping; selecting the most
>> specific method. But it is far easier since the dispatcher
>> doesn't/cannot care about generic stuff.
>>
>> Zhong Yu
>
> and shameless plug, here is the way to implement it:
> http://www.jot.fm/issues/issue_2005_12/article3/index.html
>
> cheers,
> Rémi
>
>>
>>
>>
>>
>> On Fri, Sep 13, 2013 at 4:41 AM, Millies, Sebastian
>> <Sebastian.Millies at softwareag.com> wrote:
>>> Hello there,
>>>
>>> as Project Lambda has introduced some elements of laziness into Java, I
>>> wondered about the following question:
>>> Is it possible to have methods in a lambda body dispatch on an argument type
>>> determined at run time? Or in otherwords, can the type inference for the
>>> lambda parameter be delayed by using some sort of type variable?
>>>
>>> Example:
>>>
>>> class AbstractElem {}
>>> class ConcreteElem1 extends AbstractElem {}
>>> class ConcreteElem2 extends AbstractElem {}
>>>
>>> void process() {
>>> List<? extends AbstractElem> list = new ArrayList<>();
>>> list.forEach( e -> processConcreteElem(e) );
>>> }
>>>
>>> void processConcreteElem(ConcreteElem1 e) {...}
>>> void processConcreteElem(ConcreteElem2 e) {...}
>>>
>>> This would be really useful, not having to do double-dispatch through the
>>> Visitor pattern, but it seems it's still impossible, right? Has this been discussed
>>> at all?
>>>
>>>
>>> n Sebastian
>>>
>>> Software AG - Sitz/Registered office: Uhlandstra?e 12, 64297 Darmstadt, Germany - Registergericht/Commercial register: Darmstadt HRB 1562 - Vorstand/Management Board: Karl-Heinz Streibich (Vorsitzender/Chairman), Dr. Wolfram Jost, Arnd Zinnhardt; - Aufsichtsratsvorsitzender/Chairman of the Supervisory Board: Dr. Andreas Bereczky - http://www.softwareag.com
>>>
>>>
>
>
More information about the lambda-dev
mailing list