簡體   English   中英

模式匹配時,Scala Seq [Type]錯誤

[英]Scala Seq[Type] Error when Pattern Matching

我有一個序列:

def myMethod(mySeq: Seq[SomeType]) = mySeq match {
  case Nil => // do someting
  case _   => // do something else (error happens here)
}

運行此代碼時,出現以下錯誤:

a type was inferred to be `Any`; this may indicate a programming error

到目前為止,我從未見過此錯誤。 我使用的是Scala 2.11。 我不知道這個錯誤是什么? 有什么線索嗎?

編輯:這是我所質疑的實際方法:

  def publishMessages(mySeq: Seq[MyData]): Future[Continue] = Future {

    if (mySeq.nonEmpty) {
      logger.info(s"sending a total of ${mySeq.length} for " +
        s"metric ${mySeq.head.metric} messages to kafka topic ${producerConfig.topic}")

      val jsonMessage = Json.stringify(Json.toJson(mySeq))
      val recordMetaDataF = Future {
        scala.concurrent.blocking {
          val recordMetaDataJavaFut = producer.send(
            new ProducerRecord[String, String](producerConfig.topic, jsonMessage)
          )
          // if we don't make it to Kafka within 3 seconds, we timeout
          recordMetaDataJavaFut.get(3, TimeUnit.SECONDS)
        }
      }

      recordMetaDataF.recover {
        case NonFatal(ex) =>
          logger.error("Exception while persisting data-points to kafka", ex)
      }
      Continue
    }
    else {
      logger.debug(s"skip persisting to kafka topic ${producerConfig.topic} as no " +
        " data-points were given to persist")
      Continue
    }
  }

這是編譯時看到的警告:

[warn] Scala version was updated by one of library dependencies:
[warn]  * org.scala-lang:scala-library:(2.11.1, 2.11.7, 2.11.2, 2.11.6, 2.11.5, 2.11.0) -> 2.11.8
[warn] To force scalaVersion, add the following:
[warn]  ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }
[warn] Run 'evicted' to see detailed eviction warnings

我仍然收到此錯誤:

a type was inferred to be `Any`; this may indicate a programming error

這與“執行某項操作”在您的應用中的含義有關:

scala> def myMethod(mySeq: Seq[String]) = mySeq match {
 |       case Nil => ""
 |       case _   => 12
 |     }
myMethod: (mySeq: Seq[String])Any

scala> def myMethod(mySeq: Seq[String]) = mySeq match {
 |       case Nil => ""
 |       case _   => "123"
 |     }
myMethod: (mySeq: Seq[String])String

如您所見,在第一種情況下,類型不對齊,並且編譯器推斷出的返回類型為Any ,在第二種情況下,它們都是字符串,返回的類型為String ,您應該顯式注釋返回類型,並且可能會不要編譯(除非它是Any )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM