2016-04-27 3 views
-1

У меня есть Seq как:Scala Seq [Тип] Ошибка при 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. Я не знаю, что это за ошибка? Любые подсказки?

Edit: Вот фактический метод, который у меня под вопросом:

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 
+3

Что еще вы пытаетесь сделать? –

+0

Почему это должно быть важно? Оба пути возвращают правильный и тот же тип. IntelliJ не жалуется на этот метод! – sparkr

+1

Поскольку код, который вы отправили, не должен содержать ничего с пустыми комментариями, поэтому он не вызывает ошибок. –

ответ

3

Это связано с тем, что «что-то» означает в вашем приложении:

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).

+0

Я отредактировал мой пост! Я все еще получаю эту странную ошибку! – sparkr

+0

У вашего редактирования нет ничего плохого, я подозреваю, что вы просто смотрите на неверную строку или код, который вы опубликовали, является неполным, если это не так, он не будет компилироваться вообще, потому что тип не будет соответствовать, а не даст вам предупреждение (сообщение 'Any' является предупреждением, а не ошибкой, если вы не установили свои флаги определенным образом). –