Getting generics information from a lambda is (almost) not possible: https://stackoverflow.com/questions/21887358/reflection-type-inference-on-java-8-lambdas
Sven Am 5. Oktober 2017 12:37:50 MESZ schrieb Rob Audenaerde <[email protected]>: >Thanks Bas, > >For now I'll fix it with explicit class in the constructor > >I'm not sure but maybe method-references in the LambdaModel could also >determine their type can the model could be modified to pass that on? > >-Rob > >On Wed, Oct 4, 2017 at 8:54 PM, Bas Gooren <[email protected]> wrote: > >> Rob, >> >> This is because a property model provides certain metadata (when >> available); >> E.g. When the property model points to a field, it provides the type >of >> field. >> Even when the model value is null this type information is still >available. >> >> Since this metadata is not available when using lambdas wicket uses a >> default (String). >> >> The reason it also works with a regular Model is because you provide >a >> value; thus, wicket can detect the type based on the value. >> >> When your lambda does not return a value, wicket cannot detect the >type. >> >> // Bas >> >> Verstuurd vanaf mijn iPhone >> >> > Op 4 okt. 2017 om 16:58 heeft Rob Audenaerde ><[email protected]> >> het volgende geschreven: >> > >> > We are preparing for migration to Wicket 8 (when it comes out). So >we are >> > already replacing our old PropertyModels with a backported >LambdaModel >> (we >> > use the implementation from Wicket 8). >> > >> > I noticed an odd behavior where the RangeValidator gets an empty >String >> > from the input (in validatable.getValue()) if the input is not an >integer >> > (for example, changing '2' to '2e' in the textfield). >> > >> > This results in a class cast exception. >> > >> > If I replace the Lambdamodel by a IModel<Integer> = new >Model<Integer>(2) >> > it works fine. >> > >> > After adding the type Integer.class to the NumberTextField it works >fine >> > again. >> > >> > Am I doing something wrong? >> > >> > Thanks! >> > >> > Here is the relevant code (see commented section): >> > ------ >> > >> > public class HomePage extends WebPage { >> > private static final long serialVersionUID = 1L; >> > >> > static class MyInt implements Serializable >> > { >> > Integer i=2; >> > >> > public Integer getI() { >> > return i; >> > } >> > >> > public void setI(Integer i) { >> > this.i = i; >> > } >> > } >> > public HomePage(final PageParameters parameters) { >> > super(parameters); >> > >> > IModel<MyInt> myInt = new Model(new MyInt()); >> > IModel<Integer> intModel = LambdaModel.of(myInt, MyInt::getI, >> MyInt::setI); >> > Form f = new Form("f") { >> > >> > }; >> > //Next commented line does not work if you change the input for '2' >to >> '2e' >> > and click outside the input box. >> > //NumberTextField ntf = new NumberTextField<>("tf", intModel); >> > NumberTextField ntf = new NumberTextField<>("tf", intModel, >> Integer.class); >> > ntf.setOutputMarkupId(true); >> > ntf.setMinimum( 1 ).setStep( 1 ); >> > ntf.add( new OnChangeAjaxBehavior() >> > { >> > private static final long serialVersionUID = 1L; >> > >> > @Override >> > protected void onUpdate( AjaxRequestTarget target ) >> > { >> > System.out.println("changed!"); >> > } >> > } ); >> > f.add(ntf); >> > add(f); >> > >> > } >> > } >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> >>
