Scala中AnyRef的原始类型

时间:2016-08-25 13:26:31

标签: scala cassandra prepared-statement

我正在向开源项目(支柱)添加新功能以迁移Cassandra表。我在操作中遇到一个问题,即插入值为新表。 卡桑德拉有一张桌子:

create table customer(
  name text,
  age int,
  point int,
  primary key(name, age)
)

我想从此表迁移到test_person表。

create table test_person (
  name text,
  surname text,
  point int,
  city text,
  primary key(name)
)

这是一个操作:



var s: PreparedStatement = session.prepare("insert into test_person  (name, age, point) values (?, ?, ?)"); 

var r: Row = session.execute("select * from customer").one()

var arr: Array[AnyRef] = new Array[AnyRef](3)

arr(0) = row.getObject("name")

arr(1) = row.getObject("age")

arr(2) = row.getObject("point")



session.execute(s.bind(arr))


这是错误讯息: 类型不匹配无法将原始值分配给对象。

我得到了对象并分配了一个类型为AnyRef的数组。有什么问题?

我该如何处理

2 个答案:

答案 0 :(得分:0)

这种情况正在发生,因为从java.lang.Integer到Int发生了隐式转换。 Int是AnyVal类型而不是AnyRef。尝试使用Array [Any]而不是Array [AnyRef]或者您可以通过import scala.Predef.{Integer2int => _}

禁用隐式转换
// This method in Predef.scala is causing the conversion
implicit def Integer2int(x: java.lang.Integer): Int

答案 1 :(得分:0)

这是因为AnyRef用于对象,AnyVal用于基元。您可以在案例中使用Array[Any]

var s: PreparedStatement = session.prepare("insert into test_person  (name, age, point) values (?, ?, ?)");
var r: Row = session.execute("select * from customer").one()
val arr = Array(r.getString("name"), r.getInt("age"), r.getInt("point"))