我试图了解Scala中的隐式方法,在SlashSyntax.scala中,我定义了一个自定义运算符方法:
package com.example.hello.impl
object SlashSyntax {
final class IntOps(private val intSrc: Int) {
def \(a2: Int): Int = (intSrc.toString + a2.toString).toInt
}
}
trait SlashSyntax {
import SlashSyntax._
implicit def intOps(src: Int) = new IntOps(src)
}
然后在主要方法中,我尝试使用运算符,但提示无法解析符号:
object Test {
def main(args: Array[String]): Unit = {
import com.example.hello.impl.SlashSyntax._
val s = 10 \ 2 //cannot resolve symbol \
}
}
如何使用自己的运算符?
答案 0 :(得分:2)
最简单的解决方案是将IntOps
类设为implicit class
。然后
SlashSyntax
特质(也可以将其用于其他用途)implicit conversion method ...
警告消失答案 1 :(得分:1)
错误导入导致的问题。
import com.example.hello.impl.SlashSyntax._
这里的问题是您从object SlashSyntax
而不是trait SlashSyntax
导入了所有成员。发生这种情况是因为Scala将com.example.hello.impl.SlashSyntax
视为path。所有路径只能由Stable members
组成。特性不是Stable members
,而是objects
是稳定成员,因此scala是从object SlashSyntax
导入的成员。
您只需将隐式方法移至object SlashSyntax
,即可解决此问题。
答案 2 :(得分:0)
您的对象SlashSyntax
不扩展特征SlashSyntax
,因此在执行SlashSyntax._
时看不到扩展方法。
此外,您没有执行import scala.languageFeatures.implicitConversions
。尽管您可能已将-language:implicitConversions
标志添加到了scalac。
有时缺少类型注释会破坏事物。不在您的情况下,但那里的这些东西通常很不错。
这有效:
object SlashSyntax extends SlashSyntax {
final class IntOps(private val intSrc: Int) {
def \(a2: Int): Int = (intSrc.toString + a2.toString).toInt
}
}
trait SlashSyntax {
import SlashSyntax.IntOps
implicit def intOps(src: Int): IntOps = new IntOps(src)
}