鉴于以下内容:
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}}混淆。
答案 0 :(得分:0)
您使用的语法错误,您想要的是上限:
scala> def f[A <: Foo](x: A) = x.get
f: [A <: Foo](x: A)String
你在说A
是Foo
的子类型,并告诉编译器A
确实有一个名为get
的方法。
您正在使用的语法(:
)表示存在从A
到Foo[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