[英]Getting a type mismatch on String where CharSequence is expected in Scala on Avro generated java class
我創建了一個簡單的Avro(1.7.7)模式,並讓Avro生成了Java類,這些Java類被震盪並添加到我的Spark項目中。 在生成的Java類中,我有:
public java.util.List<java.util.Map<java.lang.CharSequence,java.lang.CharSequence>> attributes;
作為從架構創建的代碼的一部分,如下所示:
{
"namespace": "com.rbh.avro.metric",
"type": "record",
"name": "Metric",
"fields": [
{ "name": "consumerId", "type": "long" },
{
"name": "data",
"type": {
"name": "Data",
"type": "record",
"fields": [
{ "name": "name", "type": "string" },
{ "name": "attributes",
"type": {
"type": "array",
"items": {
"type": "map",
"values": "string"
}
}
}
]
}
}
]
}
因此,由於String
是CharSequence
,因此我正在測試的一些代碼如下所示:
val data:Data = Data.newBuilder.setName("myData").build
val x = Map("a" -> "1", "b" -> "2", "c" -> "3").asJava
val y = Map("x" -> "42", "y" -> "27", "z" -> "-1").asJava
val z = Map("g" -> "a", "h" -> "*", "i" -> "~").asJava
val xyz = List(x,y,z).asJava
data.setAttributes(xyz)
Eclipse立即抱怨並在編譯時抱怨(Scala 2.10.5和SBT 0.13.8),我看到:
[error] /home/bkarels/dev/spark/event-gen/src/main/scala/com/rbh/generator/Generator.scala:60: type mismatch;
[error] found : java.util.List[java.util.Map[String,String]]
[error] required: java.util.List[java.util.Map[CharSequence,CharSequence]]
[error] data.setAttributes(xyz)
[error] ^
[warn] 5 warnings found
[error] one error found
[error] (compile:compileIncremental) Compilation failed
[error] Total time: 11 s, completed Jun 26, 2015 8:12:31 AM
我開始困惑了...
因此,我打開了REPL會話,此方法有效:
scala> def foo(cs:CharSequence) = {
| println(cs)}
foo: (cs: CharSequence)Unit
scala> def s:String = "bar"
s: String
scala> foo(s)
bar
為了進行某種形式的驗證,我還將這段代碼放入其中,並按預期進行編譯和運行:
val data:Data = Data.newBuilder.setName("myData").build
val cs0:CharSequence = "xxx"
val w = Map(cs0 -> cs0).asJava
val wl = List(w).asJava
data.setAttributes(wl)
就像人們可能期望的那樣,這種笨拙的冗長並不是一個有翅膀的“解決方案”。
所以有些事情是不對的,但是我對它可能是什么感到茫然。 如果您有想法請告訴我-謝謝。
Map[String, String]
不是Map[CharSequence, CharSequence]
因為Map[CharSequence, CharSequence]
允許添加非String
的鍵/值對。 看到這樣的問題是一個很好的答案。
從avroschema生成POJO時,我也在Java中也遇到了這個問題,其中用所有字符串聲明的CharSequence創建變量。 如以上注釋中所述,CharSequence是接口和String實現。 因此,直接分配String值總是失敗。 我使用的笨拙的快速解決方案是使用.toString()獲取值的字符串。
谷歌搜索后,我偶然發現有一個maven-compiler標記,該標記將字符串轉換為String,現在我完全可以忘記從avro模式創建的POJO中的CharSequence了。 不確定SBT如何提供此功能
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.