code: public <T> void put(@NonNull String key, @NonNull T value, @NonNull TypeToken<T> typeTokenOfT) {
      Preconditions.checkNotNull(key, KEY_IS_NULL);
      Preconditions.checkNotNull(value, VALUE_IS_NULL);
      Preconditions.checkNotNull(typeTokenOfT, TYPE_TOKEN_OF_T_IS_NULL);
  
      if (!accessorProvider.getAccessors().containsKey(value.getClass())) {
        String jsonValue = jsonConverter.toJson(value, typeTokenOfT.getType());
        editor.putString(key, String.valueOf(jsonValue)).apply();
        return;
      }
  
      Class<?> classOfValue = value.getClass();
  
      for (Map.Entry<Class<?>, Accessor<?>> entry : accessorProvider.getAccessors().entrySet()) {
        if (classOfValue.equals(entry.getKey())) {
          @SuppressWarnings("unchecked") Accessor<T> accessor = (Accessor<T>) entry.getValue();
          accessor.put(key, value);
        }
      }
    }
docs: Puts value to the SharedPreferences.
  
  @param key key under which value will be stored
  @param value value to be stored
  @param typeTokenOfT type token of T (e.g. {@code new TypeToken<> {})