我有一个函数,能够知道一个对象是否是Manifest类型的实例。我想将其迁移到TypeTag版本。旧功能如下:

def myIsInstanceOf[T: Manifest](that: Any) =
  implicitly[Manifest[T]].erasure.isInstance(that)

我一直在试验TypeTag,现在有了这个TypeTag版本:
// Involved definitions
def myInstanceToTpe[T: TypeTag](x: T) = typeOf[T]
def myIsInstanceOf[T: TypeTag, U: TypeTag](tag: TypeTag[T], that: U) =
  myInstanceToTpe(that) stat_<:< tag.tpe

// Some invocation examples
class A
class B extends A
class C

myIsInstanceOf(typeTag[A], new A)        /* true */
myIsInstanceOf(typeTag[A], new B)        /* true */
myIsInstanceOf(typeTag[A], new C)        /* false */

有没有更好的方法来完成此任务?是否可以改用U来省略已参数化的Any(就像在旧函数中一样)?

最佳答案

如果对删除的类型使用子类型检查就足够了,请按照上面的注释中Travis Brown的建议进行操作:

def myIsInstanceOf[T: ClassTag](that: Any) =
  classTag[T].runtimeClass.isInstance(that)

否则,您需要明确拼写U类型,以便scalac在type标签中捕获其类型:
def myIsInstanceOf[T: TypeTag, U: TypeTag] =
  typeOf[U] <:< typeOf[T]

08-17 18:05