private <T, S extends M> ModelView<? extends T> toView( ModelBinding<T> binding, ModelRuleDescriptor sourceDescriptor, Inputs inputs, ModelRuleRegistrar modelRuleRegistrar, Class<S> itemType) { CollectionBuilder<S> builder = new DefaultCollectionBuilder<S>( binding.getPath(), new Instantiator<S>(itemType, container), sourceDescriptor, inputs, modelRuleRegistrar); ModelType<CollectionBuilder<S>> viewType = new ModelType.Builder<CollectionBuilder<S>>() {}.where( new ModelType.Parameter<S>() {}, ModelType.of(itemType)) .build(); CollectionBuilderModelView<S> view = new CollectionBuilderModelView<S>(viewType, builder, binding.getPath(), sourceDescriptor); @SuppressWarnings("unchecked") ModelView<T> cast = (ModelView<T>) view; return cast; }
Instantiator(Class<I> defaultType, PolymorphicDomainObjectContainer<? super I> container) { this.defaultType = defaultType; this.itemType = ModelType.of(defaultType); this.container = container; }