code: @NonNull
      public <E extends T> MapperBuilder<T> bind(@NonNull Class<E> itemClass,
                                                 @LayoutRes int overrideItemLayoutResource,
                                                 @NonNull Binder<? super E, ?> binder,
                                                 @NonNull Predicate<? super E> predicate) {
          //noinspection unchecked
          mRules.add(new Rule(checkNotNull(itemClass, "itemClass"),
                  (Predicate<Object>) checkNotNull(predicate, "predicate"),
                  overrideLayout(checkNotNull(binder, "binder"), checkNotNull(overrideItemLayoutResource,
                          "overrideItemLayoutResource"))));
          return this;
      }
docs: Map an item type to the specified binder. The specified layout resource, if {@code >0}, will be used to override
  the {@link View} normally inflated by the specified binder.
  <p>
  In addition, this method accepts a {@link Predicate} that will be evaluated per-instance to determine if the
  specified binder is suitable for use with the item.
  @param itemClass The type of item accepted by the specified binder.
  @param overrideItemLayoutResource The layout resource that will be inflated instead of the view provided by
  {@link Binder#newView(ViewGroup)}. May be {@code 0}, in which case this parameter does nothing.
  @param binder The binder to be used to bind the specified item type.
  @param predicate A predicate that will be evaluated for each item instance to determine if the specified binder
  is suitable.
  @return This builder, to allow chaining.