static int getMaxElemSizeBandDataType(final Band[] bands) {
    int maxSignedIntType = -1;
    int maxUnsignedIntType = -1;
    int maxFloatType = -1;
    for (Band band : bands) {
      int dt = band.getDataType();
      if (ProductData.isIntType(dt)) {
        if (ProductData.isUIntType(dt)) {
          maxUnsignedIntType = Math.max(maxUnsignedIntType, dt);
        } else {
          maxSignedIntType = Math.max(maxSignedIntType, dt);
        }
      }
      if (ProductData.isFloatingPointType(dt)) {
        maxFloatType = Math.max(maxFloatType, dt);
      }
    }

    if (maxFloatType != -1) {
      if (maxUnsignedIntType == ProductData.TYPE_UINT32
          || maxSignedIntType == ProductData.TYPE_INT32) {
        return ProductData.TYPE_FLOAT64;
      } else {
        return maxFloatType;
      }
    }

    if (maxUnsignedIntType != -1) {
      if (maxSignedIntType == -1) {
        return maxUnsignedIntType;
      }
      if (ProductData.getElemSize(maxUnsignedIntType)
          >= ProductData.getElemSize(maxSignedIntType)) {
        int returnType = maxUnsignedIntType - 10 + 1;
        if (returnType > 12) {
          return ProductData.TYPE_FLOAT64;
        } else {
          return returnType;
        }
      }
    }

    if (maxSignedIntType != -1) {
      return maxSignedIntType;
    }

    return DataBuffer.TYPE_UNDEFINED;
  }