Late binding for lamba parameters?
Remi Forax
forax at univ-mlv.fr
Fri Sep 13 11:20:38 PDT 2013
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