2015-04-19 3 views
0

Учитывая следующее:Альтернативный синтаксис при определении неявного?

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 ключевое слово?

Примечание - возможно, что я смущаю это обозначение с помощью TypeTag по разделу Using a Context bound of a Type Parameter.

ответ

0

Вы используете неправильный синтаксис, что вы хотите, это верхняя граница:

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

Где ты говоришь, что A является подтипом Foo и сообщает компилятор, что A действительно есть метод, называемый get.

Синтаксис вы используете (:) означает, что существует неявное преобразование из A в Foo[A], проблема заключается в том, что Foo не принимает параметр типа, вы также можете проверить его в РЕПЛ где синтаксис столбца переведенный на неявный параметр:

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 
Смежные вопросы