簡體   English   中英

在Avro生成的Java類上的Scala中預期在CharSequence的String上獲取類型不匹配

[英]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"
              }
            }
          }
        ]
      }
    }
  ]
}

因此,由於StringCharSequence ,因此我正在測試的一些代碼如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM