public <T> boolean canBeViewedAsWritable(ModelType<T> targetType) { if (targetType.getRawClass().equals(CollectionBuilder.class)) { ModelType<?> targetItemType = targetType.getTypeVariables().get(0); return targetItemType.getRawClass().isAssignableFrom(itemType) || itemType.isAssignableFrom(targetItemType.getRawClass()); } else { return false; } }
public <T> ModelView<? extends T> asWritable( ModelBinding<T> binding, ModelRuleDescriptor sourceDescriptor, Inputs inputs, ModelRuleRegistrar modelRuleRegistrar, C instance) { ModelType<T> targetType = binding.getReference().getType(); if (canBeViewedAsWritable(targetType)) { ModelType<?> targetItemType = targetType.getTypeVariables().get(0); if (targetItemType.getRawClass().isAssignableFrom(itemType)) { // item type is super of base return toView(binding, sourceDescriptor, inputs, modelRuleRegistrar, itemType); } else { // item type is sub type Class<? extends M> subType = targetItemType.getRawClass().asSubclass(itemType); return toView(binding, sourceDescriptor, inputs, modelRuleRegistrar, subType); } } else { return null; } }