我们有一个特质Foo
和正在考虑的方法cast
,需要一个类型参数A <: Foo
和参数f: Foo
并返回Some(f: A)
如果f <: A
,否则None
类型:TypeTag包含抽象类型
trait Foo
def cast[A <: Foo](f: Foo): Option[A] = ???
如果Foo
extendings将永远是通用的,那么附加ClassTag
是结论:
def cast[A <: Foo : ClassTag](f: Foo) = f match {
case f: A => Some(f)
case _ => None
}
...
class Bar extends Foo
class Hoo extends Foo
println cast[Bar](new Bar) //→ Some(Bar)
println cast[Hoo](new Bar) //→ None
但是,如果抽象类型存在一些Foo
会怎么样?等类
trait FooTyped extends Foo {
type T
}
然后cast
刚刚被摧毁了一切:
type FooT[A] = FooTyped{ type T = A }
...
val fint: FooT[Int] = new FooTyped{ type T = Int }
println cast[FooT[String]](fint) //→ Some(FooTyped) OH WHAT?
这是因为ClassTag
不关心的类型参数和抽象类型。
所以我们打算使用TypeTag
来跟踪他们......但我不知道具体是怎么做的。
请帮我写完这篇文章:(
非常感谢你! –