code: public IntersectionClassType makeIntersectionType(List<Type> bounds, boolean allInterfaces) {
          Assert.check(bounds.nonEmpty());
          Type firstExplicitBound = bounds.head;
          if (allInterfaces) {
              bounds = bounds.prepend(syms.objectType);
          }
          ClassSymbol bc =
              new ClassSymbol(ABSTRACT|PUBLIC|SYNTHETIC|COMPOUND|ACYCLIC,
                              Type.moreInfo
                                  ? names.fromString(bounds.toString())
                                  : names.empty,
                              null,
                              syms.noSymbol);
          IntersectionClassType intersectionType = new IntersectionClassType(bounds, bc, allInterfaces);
          bc.type = intersectionType;
          bc.erasure_field = (bounds.head.hasTag(TYPEVAR)) ?
                  syms.objectType : // error condition, recover
                  erasure(firstExplicitBound);
          bc.members_field = WriteableScope.create(bc);
          return intersectionType;
      }
docs: Make an intersection type from non-empty list of types.  The list should be ordered according to
  {@link TypeSymbol#precedes(TypeSymbol, Types)}. This does not cause symbol completion as
  an extra parameter indicates as to whether all bounds are interfaces - in which case the
  supertype is implicitly assumed to be 'Object'.
  
  @param bounds        the types from which the intersection type is formed
  @param allInterfaces are all bounds interface types?