加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么scala:_ *将Seq扩展为可变长度参数列表在这种情况下不起

发布时间:2020-12-16 10:03:55 所属栏目:安全 来源:网络整理
导读:为什么 scala:_ *将Seq扩展为可变长度参数列表在这种情况下不起作用? 以及如何优雅地解决它? import java.sql.Connectionimport scalikejdbc.ConnectionPoolimport anorm.{SQL,SqlQuery,SqlRow,Row}object AnormExample extends App { Class.forName("org
为什么 scala:_ *将Seq扩展为可变长度参数列表在这种情况下不起作用?

以及如何优雅地解决它?

import java.sql.Connection
import scalikejdbc.ConnectionPool
import anorm.{SQL,SqlQuery,SqlRow,Row}

object AnormExample extends App {
  Class.forName("org.hsqldb.jdbc.JDBCDriver")
  ConnectionPool.singleton("jdbc:hsqldb:mem:hsqldb:WithAnorm","","")
  implicit val conn: Connection = ConnectionPool.borrow()

  // this works
  SQL("insert into emp (id,name) values ({id},{name})").onParams(3,"name3").executeUpdate()  

  // this does not compile
  val row = Seq(4,"name4")
  SQL("insert into emp (id,{name})").onParams(row:_*).executeUpdate()  // david
}

错误:

scala: type mismatch;
 found   : Seq[Any]
 required: Seq[anorm.ParameterValue[?]]
  SQL("insert into emp (id,{name})").onParams(row:_*).executeUpdate()  // david

PS:

<dependency>
  <groupId>play</groupId>
  <artifactId>anorm_2.10</artifactId>
  <version>2.1.1</version>
</dependency>

<dependency>
  <groupId>com.github.seratch</groupId>
  <artifactId>scalikejdbc_2.10</artifactId>
  <version>1.5.1</version>
</dependency>

<dependency>
  <groupId>org.hsqldb</groupId>
  <artifactId>hsqldb</artifactId>
  <version>2.2.9</version>
</dependency>

优雅的解决方案?

更新

根据senia的回答,这解决了这个问题:

def toParameterValueSet(seq: Seq[Any]) = seq.map(v => v: anorm.ParameterValue[_])
val row = Seq(5,"name5")
SQL("insert into emp (id,{name})").onParams(toParameterValue(row):_*).executeUpdate()

有没有办法消除声明/使用toParameterValueSet的需要?

(例如,告诉scala在自动扩展上使用隐式转换:_ *)

更新

更紧凑:

implicit def toParameterValueSet(seq: Seq[Any]): Seq[anorm.ParameterValue[_]] = seq.map(v => v: anorm.ParameterValue[_])
val row = Seq(5,{name})").onParams(row:_*).executeUpdate()

@Typesafe团队:您是否可以在acrom SQL上添加一个参数来获取一系列值?
(而不必使用:_ *)
(我同意使用命名参数是首选,但有时使用未命名参数仍然有用)

解决方法

你可以试着替换

val row = Seq(4,"name4")

val row = Seq[anorm.ParameterValue[_]](4,"name4")

所有类型都有隐式转换,因此您可以使用row.map转换集合{e => e:anorm.ParameterValue [_]}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读