IModel.map(Function) indeed is functionally equivalent to LambdaModel.of(IModel, Function), but its memory footprint is significantly larger (120 vs 80 bytes). Also, there's no equivalent method for of(IModel, Function, BiConsumer). Naturally, we can add the corresponding method, but it will remain much less efficient. These chained models require an additional object.
We've ran into similar problems many times at Topicus. Javac still is very buggy when it comes to lambda type inference. IMHO the best solution is to simply rename the methods to prevent the collisions. We could rename the methods taking an IModel as first parameter to "chained" or "from". Another solution would be a builder API, but I doubt that would make the code more readable. Best regards, Emond On Tue, Nov 15, 2016 at 8:06 PM, Martin Grigorov <[email protected]> wrote: > On Tue, Nov 15, 2016 at 2:51 PM, Emond Papegaaij <[email protected] >> wrote: > >> It seems I've hit a bug in javac: >> LambdaModelTest[46,61] reference to of is ambiguous: >> <T> of(SerializableSupplier<T>, SerializableConsumer<T>) >> <X,T> of(IModel<X>, SerializableFunction<X,T>) >> >> This clearly is wrong: >> IModel<String> personNameModel = LambdaModel.of( >> () -> person.getName(), >> (name) -> person.setName(name)); >> >> The first parameter could match both SerializableSupplier<T> and IModel<X>, >> but the second parameter only matches SerializableConsumer<T>. Eclipse has >> no >> problem with this and compiles the code just fine. >> > > I guess it confuses it with SerializableFunction<String, Void>. Although, I > agree it should return null to actually match. > > IMO we don't > need org.apache.wicket.model.LambdaModel#of(org.apache.wicket.model.IModel<X>, > org.danekja.java.util.function.serializable.SerializableFunction<X,T>) > It gives the same > as org.apache.wicket.model.IModel#map(SerializableFunction<? super T, R> > mapper). > > >> >> This now surfaces due to the change in the constructor. This testcase used >> to >> call new LambdaModel(...), which had the same signature as the first 'of'. >> I >> had to change it to use the overloaded factory method. >> >> I see two possible solutions: >> - Change the name of the factory methodes, so they are no longer >> overloaded >> (suggestions for the names are welcome) >> - Add a cast to the calling code to circumvent the bug. >> >> IMHO both are ugly. >> >> Best regards, >> Emond >> >> On dinsdag 15 november 2016 13:36:56 CET [email protected] wrote: >> > The Buildbot has detected a new failure on builder wicket-master while >> > building wicket. Full details are available at: >> > https://ci.apache.org/builders/wicket-master/builds/550 >> > >> > Buildbot URL: https://ci.apache.org/ >> > >> > Buildslave for this Build: bb_slave1_ubuntu >> > >> > Build Reason: The SingleBranchScheduler scheduler named >> > 'on-wicket-master-commit' triggered this build Build Source Stamp: >> [branch >> > master] b40e9e1cd9ad7a9ffc63ab6c329c8d9c8b78b924 Blamelist: Emond >> Papegaaij >> > <[email protected]> >> > >> > BUILD FAILED: failed compile >> > >> > Sincerely, >> > -The Buildbot >> >> >>
