Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何关闭特定隐式';在Scala中,由于重载方法而阻止代码编译的是什么?_Scala_Implicit Conversion - Fatal编程技术网

如何关闭特定隐式';在Scala中,由于重载方法而阻止代码编译的是什么?

如何关闭特定隐式';在Scala中,由于重载方法而阻止代码编译的是什么?,scala,implicit-conversion,Scala,Implicit Conversion,我正忙着自己回答这个问题: 我发现了一个可能的解决方案: 所以我决定用Scala重写这个示例: def htmlEncode(input: String) = htmlEncode_sb(input).toString def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = { for ((c, i) <- input.zipWithIndex) {

我正忙着自己回答这个问题:

我发现了一个可能的解决方案:

所以我决定用Scala重写这个示例:

  def htmlEncode(input: String) = htmlEncode_sb(input).toString

  def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = {
    for ((c, i) <- input.zipWithIndex) {
      if (CharUtils.isAscii(c)) {
        // Encode common HTML equivalent characters
        stringBuilder.append(StringEscapeUtils.escapeHtml4(c.toString()))
      } else {
        // Why isn't this done in escapeHtml4()?
        stringBuilder.append(String.format("&#x%x;": String, Character.codePointAt(input, i)))
      }
    }
    stringBuilder
  }
}
然而,编译器并没有得到这样的提示,即带有java.util.Locale的重载方法会起作用

我把代码转移到一个不那么混乱的类中,认为这样做可能很重要,但没有这样的运气

所以问题是,一个人如何禁用不属于自己选择的隐式


如何满足编译器知道您真正想要的内容的需求

显然,这包括:

    stringBuilder.append(String.format("&#x%x;": String, Character.codePointAt(input, i).toString))
然而,我相信,如果toString首先掌握了一些东西,那么这可能会首先破坏调用格式的整个目的


所以我最初的问题仍然有效…

,这可能真的有效:

  def htmlEncode(input: String) = htmlEncode_sb(input).toString

  def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = {
    for ((c, i) <- input.zipWithIndex) {
      if (CharUtils.isAscii(c)) {
        // Encode common HTML equivalent characters
        stringBuilder.append(StringEscapeUtils.escapeHtml4(c.toString()))
      } else {
        // Why isn't this done in escapeHtml4()?
        stringBuilder.append(String.format("""&#x%s;""": String, Character.codePointAt(input, i).toString))
      }
    }
    stringBuilder
  }
}

这显然有效

  def htmlEncode(input: String) = htmlEncode_sb(input).toString

  def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = {
    stringBuilder.synchronized {
      for ((c, i) <- input.zipWithIndex) {
        if (CharUtils.isAscii(c)) {
          // Encode common HTML equivalent characters
          stringBuilder.append(StringEscapeUtils.escapeHtml4(c.toString()))
        } else {
          // Why isn't this done in escapeHtml4()?
          stringBuilder.append(s"""&#${Character.codePointAt(input, i)};""")
        }
      }
      stringBuilder
    }
  }
def htmlEncode(输入:字符串)=htmlEncode_sb(输入).toString
def htmlEncode_sb(输入:字符串,stringBuilder:stringBuilder=new stringBuilder())={
stringBuilder.synchronized{

对于((c,i),您的问题与隐式无关*,而与Scala
Int
不是
对象这一事实有关。错误消息告诉您真相:
String.format
有两个重载,并且您的参数列表与它们都不匹配

尝试使用
Int.box(Character.codePointAt(input,i))
将参数设置为
对象


*好的,它与隐式有一点关系,因为
Int
可以隐式转换为
整数
,但这不适用于将
Int
转换为
对象

,答案如下:
[IllegalFormatConversionException:x!=java.lang.String]
我说,很明显,我们已经因为重复测试而激怒了Mandrill,他们的服务器现在正在阻止测试尝试。(叹气)。又一个问题提出了……我认为Scala没有原语?因为Int有方法(比如toString等)这难道不表明它是一个对象吗?我的问题可能是沉默的,因为我找到了一种通过修改它来编译代码的方法,但我认为问题的前提是——如何显式地关闭不希望应用于特定范围内的隐式函数?在Scala中,所有东西都是对象,但不是所有东西都是引用,只有y引用是Java对象。请查看全局图。该链接的第一行说明:与Java不同,Scala中的所有值都是对象(包括数值和函数)。您是否有文档专门说明引用和对象之间的区别(在此特定上下文中)?最权威的文件是,第12.1节中说,“子类AnyRef表示底层主机系统中作为对象表示的所有值。”因此,对于JVM上托管的Scala,不从AnyRef继承的类的实例不是Java对象。
  def htmlEncode(input: String) = htmlEncode_sb(input).toString

  def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = {
    for ((c, i) <- input.zipWithIndex) {
      if (CharUtils.isAscii(c)) {
        // Encode common HTML equivalent characters
        stringBuilder.append(StringEscapeUtils.escapeHtml4(c.toString()))
      } else {
        // Why isn't this done in escapeHtml4()?
        stringBuilder.append(String.format("""&#x%s;""": String, Character.codePointAt(input, i).toString))
      }
    }
    stringBuilder
  }
}
 s"""&#x${Character.codePointAt(input, i)};"""
  def htmlEncode(input: String) = htmlEncode_sb(input).toString

  def htmlEncode_sb(input: String, stringBuilder: StringBuilder = new StringBuilder()) = {
    stringBuilder.synchronized {
      for ((c, i) <- input.zipWithIndex) {
        if (CharUtils.isAscii(c)) {
          // Encode common HTML equivalent characters
          stringBuilder.append(StringEscapeUtils.escapeHtml4(c.toString()))
        } else {
          // Why isn't this done in escapeHtml4()?
          stringBuilder.append(s"""&#${Character.codePointAt(input, i)};""")
        }
      }
      stringBuilder
    }
  }