0

私はこれが可能であることを知っています:

import scala.reflect._

trait Foo[A]

def isDouble[A: ClassTag](foo: Foo[A]) = classTag[A].runtimeClass == classOf[Double]

object Foo1 extends Foo[Double]
object Foo2 extends Foo[String]
assert(isDouble(Foo1))
assert(!isDouble(Foo2))

Aしかし、今は抽象型にしたい:

import scala.reflect._

trait Foo {
  type A
}

def isDouble(foo: Foo): Boolean = ???

object Foo1 extends Foo {override type A = Double}
object Foo2 extends Foo {override type A = String}
assert(isDouble(Foo1))
assert(!isDouble(Foo2))

機能を実装するにはどうすればよいisDoubleですか?

4

1 に答える 1

0

Scala では、カリー化された関数 (この場合はfoo)の左側にある引数を参照できます。

def isDouble(foo: Foo)(implicit ev: ClassTag[foo.A]) = classTag[foo.A].runtimeClass == classOf[Double]
于 2016-01-29T22:22:08.423 に答える