我有一组类过滤仅特定类型的对象。
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来实现这一点。
答案 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 - 这里讨论为什么特征不容易。