Scala - Object类型的表达式不确认键入String

时间:2015-05-30 18:01:21

标签: scala

我试图使这个特性尽可能接近惯用的Scala: 我的目标是将ScalaTest类中的这个特征混合为

class MyTest extends FunSpect with Matchers With MyTrait

特质本身:

import java.io.{FileFilter, File}
import com.fasterxml.jackson.core
import com.fasterxml.jackson.databind.node.{JsonNodeFactory, ArrayNode} 
import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper} 
import com.fasterxml.jackson.core.JsonFactory

     trait TicketInfo_Json {
          var testJsonOpt: Option[JsonNode] = None
          var jsonFileOpt: Option[File] = None

          val testJson = {
            try {
                val jsonFile = new File(this.getClass.getResource("/ticketJson.json").getPath)
                testJsonOpt = if(jsonFile.exists() && jsonFile.isFile) Some(new ObjectMapper().readTree(jsonFile)) else None
                testJsonOpt.get.toString
            } catch {
                case ioe: java.io.IOException => Some(new JsonNodeFactory(true).arrayNode()).get
            }

          }

           def getJson: String = testJson // Error: Expression of type Object doesn't confirm to type String

        }

    }

目标是能够调用方法testJson,我希望特征中的逻辑将处理ticketJson.json json文件并通过getJson返回一个json文件回到我的通话班。在本课程中,我的测试类。

但是我收到了错误

Expression of type Object doesn't confirm to type String

我努力让这个项目正确的原因是,我正试图远离变种,但我仍然无法绕过使用vals的最佳方式。我如何使用选项产生良好效果。我的代码有很强的代码味道,我还不知道如何处理这个问题。

这是我所拥有的。如何避免上述错误?

提前致谢

1 个答案:

答案 0 :(得分:2)

您的catch块看起来返回非String值,因此变量testJson的类型为Object,而不是String。尝试找出以下代码返回的内容:

case ioe: java.io.IOException => Some(new JsonNodeFactory(true).arrayNode()).get

try部分返回Stringcatch部分返回ArrayNode。因此,try-catch块的结果类型是StringArrayNode最近的超类,它将是Object