当前位置: 首页 > 知识库问答 >
问题:

重载方法调用有替代方法:String.Format

陶博耘
2023-03-14

我编写了下面的Scala代码来处理传入的字符串,格式化字符串,将其附加到StringBuilder中,并将带有转义unicode的格式化的字符串返回给调用方进行其他处理。

Scala编译器在有string.format调用的行中抱怨以下错误:

class TestClass {    
    private def escapeUnicodeStuff(input: String): String = {
            //type StringBuilder = scala.collection.mutable.StringBuilder
            val sb = new StringBuilder()
            val cPtArray = toCodePointArray(input) //this method call returns an Array[Int]
            val len = cPtArray.length
            for (i <- 0 until len) {
              if (cPtArray(i) > 65535) {
                val hi = (cPtArray(i) - 0x10000) / 0x400 + 0xD800
                val lo = (cPtArray(i) - 0x10000) % 0x400 + 0xDC00
                sb.append(String.format("\\u%04x\\u%04x", hi, lo)) //**complains here**
              } else if (codePointArray(i) > 127) {
                sb.append(String.format("\\u%04x", codePointArray(i))) //**complains here**
              } else {
                sb.append(String.format("%c", codePointArray(i))) //**complains here**
              }
            }
            sb.toString
          }

    }

共有1个答案

伯丁雷
2023-03-14

Java中的string.format方法需要objects作为参数。Java中的object类型等效于Scala中的anyref类型。Scala中的基元类型扩展anyval-而不是anyref。在文档或本答案中阅读有关anyvalanyrefany之间差异的更多信息。最明显的修正是使用Java中的integer包装类来获取ints对象表示:

String.format("\\u%04x\\u%04x", new Integer(hi), new Integer(lo))

使用这些包装器类几乎是单一Scala代码的象征,只有在没有更好的选择时才应该用于与Java的互操作性。在Scala中更自然的方法是使用Stringops等效方法格式:

"\\u%04x\\u%04x".format(hi, lo)

您还可以使用f内插器来获得更简洁的语法:

f"\\u$hi%04x\\u$lo%04x"
toCodePointArray(input).foreach {
    case x if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        sb.append(f"\\u$hi%04x\\u$lo%04x") 
    case x if > 127 => sb.append(f"\\u$x%04x") 
    case x => sb.append(f"$x%c")    
}
def escapeUnicodeStuff(input: String) = toCodePointArray(input).foldLeft("") {
    case (acc, x) if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        acc + f"\\u$hi%04x\\u$lo%04x"
    case (acc, x) if x > 127 => acc + f"\\u$x%04x"
    case (acc, x) => acc + f"$x%c"
}

或偶数映射,后跟mkstring:

def escapeUnicodeStuff(input: String) = toCodePointArray(input).map {
    case x if x > 65535 => 
        val hi = (x - 0x10000) / 0x400 + 0xD800
        val lo = (x - 0x10000) % 0x400 + 0xDC00
        f"\\u$hi%04x\\u$lo%04x"
    case x if x > 127 => f"\\u$x%04x"
    case x => f"$x%c"
}.mkString
 类似资料:
  • 问题内容: 我到处都看到应通过以下方式调用超类方法的示例: 这样做有什么不利之处吗? 问题答案: 请考虑以下情况: 因此,这些类形成了一个所谓的继承钻石: 运行代码会产生 不好,因为跳过了s 。其原因是因为的调用的直接。 的目的是解决继承钻石。如果您取消评论 和注释掉 该代码产生了更令人满意的结果: 现在,所有方法都被调用。请注意,在当时你定义你可能会 认为 这是与调用,但是你错了。在上述情况下,

  • 问题内容: 是否可以使用Golang以类似的方式工作,例如函数重载或C#中的可选参数?还是另一种方式? 问题答案: 直接支持函数重载和可选参数。您可以解决它们,建立自己的参数结构。我的意思是这样(未经测试,可能无法使用…)编辑:现在已测试…

  • 问题内容: 对于以下代码,为什么打印A,B?我希望它能打印B,B。而且,由JVM执行的方法调用是动态还是静态评估? 问题答案: 重载由编译器 静态 确定。 重写 是在执行时完成的,但这不是这里的因素。 的静态类型为A,因此第一个方法调用解析为。

  • Item 26中说明了对使用通用引用参数的函数,无论是独立函数还是成员函数(尤其是构造函数),进行重载都会导致一系列问题。但是也提供了一些示例,如果能够按照我们期望的方式运行,重载可能也是有用的。这个Item探讨了几种通过避免在通用引用上重载的设计或者通过限制通用引用可以匹配的参数类型的方式来实现所需行为的方案。 讨论基于Item 26中的示例,如果你还没有阅读Item 26,请先阅读在继续本It

  • 问题内容: 我正在使用StAX创建一个很大的xml文档。到目前为止,我一直使用IndentingXMLStreamwriter类来获取格式正确的文档。几天前,我们使用旧的jdk版本(6.26)设置了一个jenkins服务器,在该版本上我遇到了构建错误。 我认为由于安装了jdk版本而找不到该软件包。由于不同的原因,这不能更改(顺便说一句,是否有人知道添加了此软件包(com.sun.xml.inter

  • 我有一个Foo和Bar对象的列表,以及每个相应对象的转换器。 Convert-method需要有所不同,因为Bar1与Bar2和Bar3等有很大不同,但是我想创建一个方法来处理所有可能的列表。 是否可以创建一个泛型方法,根据列表的内容调用相应的非泛型方法? 到目前为止,我已经尝试过了: 但这并不能编译,因为"无法解析方法'Converts(T, S)'" 有什么想法吗?