在Scala中如何检查基本特征中对象的运行时类型

时间:2014-01-19 19:42:56

标签: scala runtime typechecking

我有一组类过滤仅特定类型的对象。

trait FilterTrait {
    type RequiredType <: BaseType

    def filter(baseObjects: Seq[BaseType]): Seq[BaseType] = {
        val (requiredTypeObjects, nonRequiredTypeObjects) = baseObjects.partition(isOfRequiredType)

        nonRequiredTypeObjects ++ 
        filterRequiredType(requiredTypeObjects.asInstanceOf[Seq[RequiredType]])
    }

    def filterRequiredType(typeObjects: Seq[RequiredType]): Seq[RequiredType]

    def isOfRequiredType[A <: BaseType](aObj: A): Boolean = ???(to be implemented)
}

class AFilter extends FilterTrait {
    type RequiredType = CompoundType
    ...
}

class BFilter extends FilterTrait {
    type RequiredType = BaseType with ATrait
    ...
}

我尝试在基类中实现isOfRequiredType方法:

def isOfRequiredType[A <: BaseType](aObj: A): Boolean = 
    classOf[RequiredType].isAssignableFrom(aObj.getClass)

我收到错误“需要类类型,但找到了RequiredType”。

我可以通过在所有子类中实现isOfRequiredType来实现这一点。但我想知道是否有办法通过在基本特征中实现isOfRequiredType来实现这一点。

1 个答案:

答案 0 :(得分:0)

如果您可以使用抽象类,可以更容易地完成,如下所示:

abstract class Filter[RequiredType<:BaseType:Manifest] {
   def isOfRequiredType[A <: BaseType](aObj: A): Boolean = 
       manifest[RequiredType].runtimeClass.isAssignableFrom(aObj.getClass)       

   ...
}

上面的代码使用了清单 - 将来应该被TypeTags替换,但是我对scala 2.10的这一部分没有多少经验,所以我现在坚持使用清单版本。

https://groups.google.com/forum/#!msg/scala-user/2X7pHwqd6_A/fOd1yyURIhEJ - 这里讨论为什么特征不容易。