【问题标题】:Scala String type inference in IntelliJ IDEAIntelliJ IDEA 中的 Scala 字符串类型推断
【发布时间】:2018-04-17 02:50:00
【问题描述】:

据我所知,在 Scala 中

Stringjava.lang.String 的别名

正如here 解释的那样,可以在Predef.scala 中看到:

type String = java.lang.String

所以本质上,它们是相同的。

但是,在 IntelliJ IDEA 2017.2.5 中,以下代码会产生错误:

trait PerceptualHash {
  def calc[A](bi: BufferedImage): A
}

sealed trait BinaryStringPerceptualHash extends PerceptualHash {
  override def calc[String](bi: BufferedImage): String
}

private object GeneralBinaryStringPerceptualHash extends BinaryStringPerceptualHash {
  def calc[String](bi: BufferedImage): String = "0"
}

这里,"0" 带有下划线,并带有消息“java.lang.String 类型的表达式不符合预期的 String 类型”。

但如果我像这样更改"0"

def calc[String](bi: BufferedImage): String = new String("0")

然后我没有收到这样的错误消息。

发生了什么事?是预期的行为(如果是,为什么),是我做错了什么,还是 Intellij IDEA 中的类型推断错误?

【问题讨论】:

    标签: string scala intellij-idea type-inference


    【解决方案1】:

    您对calc 的签名表明PerceptualHash 可以将BufferedImage 转换为调用者要求的任何类型。例如。这样做是合法的

    GeneralBinaryStringPerceptualHash.calc[Int](image)
    

    所以String

    def calc[String](bi: BufferedImage): String = "0"
    

    只是您给参数的名称,与标准String 类型无关。是一样的

    def calc[A](bi: BufferedImage): A = "0"
    

    但如果我像这样更改“0”:

    def calc[String](bi: BufferedImage): String = new String("0")
    

    然后我没有收到这样的错误消息。

    您应该会收到一条不同的错误消息,但您仍然应该收到一条。

    可能想要

    trait PerceptualHash[A] {
      def calc(bi: BufferedImage): A
    }
    
    // calc is already def calc(bi: BufferedImage): String here, no need to override
    sealed trait BinaryStringPerceptualHash extends PerceptualHash[String]
    

    改为。

    【讨论】:

    • 确实是我想要的,谢谢。你对在BinaryStringPerceptualHash 中覆盖calc 的无用的评论让我大吃一惊:-) 这就是类型参数化的力量。
    • 我要补充一点,BinaryStringPerceptualHash 本身并不是特别有用,除非 1) 它有一些共享代码或 2) 你需要测试一些 PerceptualHash 是否是 BinaryStringPerceptualHash。跨度>
    • 你是对的@AlexeyRomanov,我只会保留BinaryStringPerceptualHash 的实现并创建扩展它的类/对象。
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2016-11-30
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多