content: package com.alibaba.fastjson2;
  
  import com.alibaba.fastjson2.util.TypeUtils;
  
  import java.lang.reflect.Type;
  import java.time.ZoneId;
  import java.util.function.BiFunction;
  
  import static com.alibaba.fastjson2.util.DateUtils.DEFAULT_ZONE_ID;
  
  class JSONPathTypedMulti
          extends JSONPath {
      final JSONPath[] paths;
      final Type[] types;
      final String[] formats;
      final long[] pathFeatures;
      final ZoneId zoneId;
  
      protected JSONPathTypedMulti(
              JSONPath[] paths,
              Type[] types,
              String[] formats,
              long[] pathFeatures,
              ZoneId zoneId,
              long features
      ) {
          super(JSON.toJSONString(paths), features);
          this.types = types;
          this.paths = paths;
          this.formats = formats;
          this.pathFeatures = pathFeatures;
          this.zoneId = zoneId;
      }
  
      @Override
      public JSONPath getParent() {
          return paths[0].getParent();
      }
  
      @Override
      public boolean isRef() {
          for (JSONPath jsonPath : paths) {
              if (!jsonPath.isRef()) {
                  return false;
              }
          }
          return true;
      }
  
      @Override
      public boolean contains(Object object) {
          for (JSONPath jsonPath : paths) {
              if (jsonPath.contains(object)) {
                  return true;
              }
          }
          return false;
      }
  
      protected final boolean ignoreError(int index) {
          return pathFeatures != null
                  && index < pathFeatures.length
                  && (pathFeatures[index] & Feature.NullOnError.mask) != 0;
      }
  
      @Override
      public Object eval(Object object) {
          Object[] array = new Object[paths.length];
          for (int i = 0; i < paths.length; i++) {
              JSONPath jsonPath = paths[i];
              Object result = jsonPath.eval(object);
              try {
                  array[i] = TypeUtils.cast(result, types[i]);
              } catch (Exception e) {
                  if (!ignoreError(i)) {
                      throw new JSONException("jsonpath eval path, path : " + jsonPath + ", msg : " + e.getMessage(), e);
                  }
              }
          }
          return array;
      }
  
      protected JSONReader.Context createContext() {
          JSONReader.Context context = JSONFactory.createReadContext(features);
          if (zoneId != null && zoneId != DEFAULT_ZONE_ID) {
              context.zoneId = zoneId;
          }
          return context;
      }
  
      @Override
      public Object extract(JSONReader jsonReader) {
          Object object = jsonReader.readAny();
          return eval(object);
      }
  
      @Override
      public String extractScalar(JSONReader jsonReader) {
          Object object = extract(jsonReader);
          return JSON.toJSONString(object);
      }
  
      @Override
      public void set(Object object, Object value) {
          throw new JSONException("unsupported operation");
      }
  
      @Override
      public void set(Object object, Object value, JSONReader.Feature... readerFeatures) {
          throw new JSONException("unsupported operation");
      }
  
      @Override
      public void setCallback(Object object, BiFunction callback) {
          throw new JSONException("unsupported operation");
      }
  
      @Override
      public void setInt(Object object, int value) {
          throw new JSONException("unsupported operation");
      }
  
      @Override
      public void setLong(Object object, long value) {
          throw new JSONException("unsupported operation");
      }
  
      @Override
      public boolean remove(Object object) {
          throw new JSONException("unsupported operation");
      }
  }
  