据我了解,在 Scala 中
String
是别名java.lang.String
为解释在这里,并且可以在可见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 类型的表达式不符合预期的字符串类型”。
但如果我"0"
像这样改变:
def calc[String](bi: BufferedImage): String = new String("0")
然后我没有收到这样的错误信息。
这是怎么回事?这是预期的行为(如果是,为什么),我做错了什么,还是 Intellij IDEA 中的类型推断错误?
您的签名calc
表示 aPerceptualHash
可以将 a 转换为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]
反而。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句