Scala报错:Expression of type Unit不符合预期类型Client求助
解决Scala中Jersey Client设置超时后返回类型不匹配的问题
你收到的错误提示:
Expression of type Unit doesn't confirm to expected type Client
其实是Scala代码块返回值的特性导致的,咱们一步步来拆解:
问题原因
在Scala里,代码块的返回值是块内最后一行表达式的结果。你看这段代码:
val client: Client = Client.create() client.setConnectTimeout(5000) //Or client.setConnectTimeout(Int.box(5000))
setConnectTimeout是Java风格的void方法,在Scala里对应的返回类型是Unit,所以整个case _ =>代码块最后返回的是Unit,但方法要求返回Client类型,自然就报类型不匹配的错误了。
正确的写法
有两种简洁的方式解决这个问题:
方式1:显式返回Client对象(最稳妥)
既然代码块返回最后一行的结果,那咱们把配置好的client放在代码块最后一行即可:
case _ => { import com.sun.jersey.api.client.Client val client: Client = Client.create() client.setConnectTimeout(5000) // 执行连接超时配置 client // 最后一行返回client实例,匹配方法的返回类型要求 }
方式2:链式调用(如果API支持的话)
如果setConnectTimeout方法是Builder模式(返回Client本身),可以用链式调用简化代码,但要注意:Jersey 1.x的setConnectTimeout是void方法,所以这个方式不适用。不过如果是其他支持链式调用的客户端,可以这么写:
case _ => { import com.sun.jersey.api.client.Client Client.create().setConnectTimeout(5000) }
另外补充一点:你尝试的Int.box(5000)完全没必要,Scala会自动完成基本类型到包装类型的转换,直接传入5000就可以正常工作。
内容的提问来源于stack exchange,提问作者Senthil
相关产品推荐
相关产品推荐

