定义隐式时的替代语法?

时间:2015-04-19 14:23:58

标签: scala

鉴于以下内容:

scala> trait Foo { def get: String = "get" }
defined trait Foo

我实现了它并隐含了:

scala> case class FooImpl(x: String) extends Foo {
     |   override def get = s"got $x"
     | }
defined class FooImpl

scala> implicit val fooImpl = FooImpl("yo")
fooImpl: FooImpl = FooImpl(yo)

最后,我尝试编写一个隐式解析Foo的方法,在隐式解析的类上返回get

scala> def f[A: Foo](x: A) = x.get
<console>:11: error: Foo does not take type parameters
       def f[A: Foo](x: A) = x.get
              ^
<console>:11: error: value get is not a member of type parameter A
       def f[A: Foo](x: A) = x.get
                               ^

但我得到了上述错误。

所以我使用implicit关键字重写了它:

scala> def f(implicit x: Foo): String = x.get
f: (implicit x: Foo)String

scala> f
res0: String = got yo

是否可以重写此示例以明确指定implicit关键字?

注意 - 我可能会在Using a Context bound of a Type Parameter部分TypeTag下将此表示法与{{3}}混淆。

1 个答案:

答案 0 :(得分:0)

您使用的语法错误,您想要的是上限:

scala> def f[A <: Foo](x: A) = x.get
f: [A <: Foo](x: A)String

你在说AFoo的子类型,并告诉编译器A确实有一个名为get的方法。

您正在使用的语法(:)表示存在从AFoo[A]的隐式转换,问题是Foo如果不采用类型参数,您也可以将其检入REPL,其中列语法被转换为隐式参数:

scala> trait Foo2[T]
defined trait Foo2

scala> def g[T: Foo2](x: Int): Int = x
g: [T](x: Int)(implicit evidence$1: Foo2[T])Int