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;
   }
 }