嵌套函数中的类型不匹配

type mismatch in nested functions

Objective:- 从 aws s3 存储桶中检索 json 对象。失败重试。 如果重试次数已用尽,请将错误消息发送到 azure 的事件中心。

//重试函数

def retry[T](n: Int, id: String)(fn: => T): Option[T]  = { 
        Try(fn) match {
        case Success(x) => Some(x)
        case Failure(e) => {
        Thread.sleep(1000)
          if (n > 1) {
           retry(n - 1, id)(fn)
          } else {
            val eMessage = "TransactionId =" + id + " : ".concat(e.toString())
            SendMessage(eMessage, event_hub_client)
            None
            }
          }    
        }
      }

//从aws s3 bucket

中获取对象的主要函数(上面有重试)
 def getS3Object(s3ObjectName: String, s3Client: AmazonS3, evtClient: EventHubClient): String = {
        retry(2,s3ObjectName) {
          val inputS3Stream = s3Client.getObject("my_s3_bucket", s3ObjectName).getObjectContent
          val inputS3String = IOUtils.toString(inputS3Stream, "UTF-8")
          return inputS3String
        }
      }

我收到以下编译失败消息:-

错误:类型不匹配
发现:选项[无]
必填:字符串
retry2(2,s3ObjectName)

如何声明retry和main函数的return类型使其匹配?

就类型而言 retry 看起来还不错。你需要调整你的其他方法。

将其设为 return Option[String] 或使用 getOrElse(..) 如果您想回退到其他值。

 def getS3Object(s3ObjectName: String, s3Client: AmazonS3, evtClient: EventHubClient): Option[String] = {
        retry(2,s3ObjectName) {
          val inputS3Stream = s3Client.getObject("my_s3_bucket", s3ObjectName).getObjectContent
          val inputS3String = IOUtils.toString(inputS3Stream, "UTF-8")
          inputS3String
        }
      }

请注意删除了 return 关键字,该关键字没有用,而且与您认为的不同(我会让您自己搜索该主题)。