2016-08-25 74 views
0

我正在向開源項目(支柱)添加新功能來遷移Cassandra表。我在操作中遇到了一個問題,即插入一個新表格的值。 有在卡桑德拉表:Scala中的AnyRef的原始類型

 
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的數組。哪裏不對?

我該如何處理這個

+0

哪一行會引發錯誤? – Samar

+0

arr(1)= row.getObject(「age」) arr(2)= row.getObject(「point」) – Mustafa

+0

does row.getObject(「age」)是返回一個對象還是一個int? – Samar

回答

0

發生這種情況,因爲有一個隱式轉換從發生到java.lang.Integer的詮釋。 Int的類型是AnyVal而不是AnyRef。嘗試使用數組[任何]而不是數組[AnyRef]也可以通過import scala.Predef.{Integer2int => _}

// This method in Predef.scala is causing the conversion 
implicit def Integer2int(x: java.lang.Integer): Int 
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")) 
+0

它的工作原理,但我不想知道表中有多少列。我可以在Array(..)中做一個循環嗎? – Mustafa

+0

您可以使用Any類型的ArrayBuffer。然後你可以繼續添加更多的條目。 – tuxdna