在String上获取类型不匹配,其中在Avala生成的Java类的Scala中需要CharSequence

时间:2015-06-26 13:43:27

标签: java scala avro

我创建了一个简单的Avro(1.7.7)模式,让Avro生成我的Java类,这些类被激活并添加到我的Spark项目中。在生成的java类中,我有:

{
  "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

因此,由于CharSequenceval 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) ,我测试的部分代码如下所示:

[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

Eclipse立即抱怨并在编译时(Scala 2.10.5& SBT 0.13.8)我看到了:

scala> def foo(cs:CharSequence) = {
     |   println(cs)}
foo: (cs: CharSequence)Unit

scala> def s:String = "bar"
s: String

scala> foo(s)
bar

开始我的困惑......

所以,我打开了一个REPL会话,这很有效:

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)

我还要进行某种验证,将此代码放入其中并按预期编译和运行:

fc-content

正如人们所预料的那样,这种笨拙的冗长并不是一个解决方案"有翅膀......

所以有些不对劲,但我不知道它会是什么。如果您有想法,请告诉我 - 谢谢。

2 个答案:

答案 0 :(得分:1)

Map[String, String]不是Map[CharSequence, CharSequence],因为Map[CharSequence, CharSequence]允许添加非String的键/值对。请参阅此SO question以获得出色的答案。

答案 1 :(得分:0)

我在Java中也遇到了这个问题,同时从avroschema生成POJO,其中变量是使用CharSequence为所有字符串声明创建的。正如上面的评论中所提到的,CharSequence是一个接口和String实现。因此,String值的直接赋值总是失败。我正在使用一个笨拙的快速解决方案,使用.toString()来获取值的String。

在Google上搜索时,碰巧看到有一个maven-compiler标签,它将字符串转换为字符串,现在我可以完全忘记从avro架构创建的POJO中的CharSequence。不确定SBT如何能够提供此功能