code: private static boolean isAssignableFrom(WildcardType type1, Type type2) {
          if (!isAssignableFrom(type1.getUpperBounds()[0], type2)) {
              return false;
          }
          if (type1.getLowerBounds().length > 0 && !isAssignableFrom(type2, type1.getLowerBounds()[0])) {
              return false;
          }
          return true;
      }
docs: This logic is shared for all actual types i.e. raw types, parameterized types and generic array types.