我试图使这个特性尽可能接近惯用的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的最佳方式。我如何使用选项产生良好效果。我的代码有很强的代码味道,我还不知道如何处理这个问题。
这是我所拥有的。如何避免上述错误?
提前致谢
答案 0 :(得分:2)
您的catch
块看起来返回非String
值,因此变量testJson
的类型为Object
,而不是String
。尝试找出以下代码返回的内容:
case ioe: java.io.IOException => Some(new JsonNodeFactory(true).arrayNode()).get
try
部分返回String
和catch
部分返回ArrayNode
。因此,try-catch
块的结果类型是String
和ArrayNode
最近的超类,它将是Object
。