anchor.diff:    }
   
     static String _canonicalRecipeOfGenericFunction(
  -          Rti baseFunctionType, Object bounds) =>
  +          Rti baseFunctionType, Object? bounds) =>
         Rti._getCanonicalRecipe(baseFunctionType) +
         Recipe.startTypeArgumentsString +
         _canonicalRecipeJoin(bounds) +
         Recipe.endTypeArgumentsString;
   
     static Rti _lookupGenericFunctionRti(
  -      Object universe, Rti baseFunctionType, Object bounds, bool normalize) {
  +      Object? universe, Rti baseFunctionType, Object? bounds, bool normalize) {
       String key = _canonicalRecipeOfGenericFunction(baseFunctionType, bounds);
       var cache = evalCache(universe);
  -    var probe = _cacheGet(cache, key);
  -    if (probe != null) return _castToRti(probe);
  +    var probe = _Utils.mapGet(cache, key);
  +    if (probe != null) return _Utils.asRti(probe);
       return _installRti(
           universe,
           key,
  
positive.code:   /// If kind == kindStar, holds T? where T is the base type.
    /// - This case is lazily initialized during subtype checks.
    @pragma('dart2js:noElision')
    dynamic _precomputed1;
  
    static Object? _getPrecomputed1(Rti rti) => rti._precomputed1;
  
    static void _setPrecomputed1(Rti rti, precomputed) {
      rti._precomputed1 = precomputed;
    }
  
    static Rti _getQuestionFromStar(universe, Rti rti) {
      assert(_getKind(rti) == kindStar);
      Rti? question = _castToRtiOrNull(_getPrecomputed1(rti));
      if (question == null) {
        question =
            _Universe._lookupQuestionRti(universe, _getStarArgument(rti), true);
  
negative.code:   }
    String key = Rti._getCanonicalRecipe(instantiationRti);
    var probe = _Utils.mapGet(cache, key);
    if (probe != null) return _Utils.asRti(probe);
    Rti rti = _substitute(_theUniverse(),
        Rti._getGenericFunctionBase(genericFunctionRti), typeArguments, 0);
    _Utils.mapSet(cache, key, rti);
  