2014-01-19 1 views
1

특정 유형의 객체 만 필터링하는 클래스 세트가 있습니다. 스칼라에서 기본 형질에서 객체의 런타임 유형을 확인하는 방법

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
이 같은 추상 클래스를 사용할 수있는 경우를 쉽게 수행 할 수 있습니다

:

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

    ... 
} 
위의 코드는 매니페스트 사용

- 미래의 TypeTags로 대체하기로되어있다 howeve 나는이 없습니다 scala 2.10의이 부분에 대해 많은 경험을 할 수 있으므로 지금은 manifest 버전을 사용합니다.

https://groups.google.com/forum/#!msg/scala-user/2X7pHwqd6_A/fOd1yyURIhEJ - 여기에는 특성과 그렇게 쉬운 일이 아닙니다 왜 토론이다.

+0

나는 매니페스트에 관해 읽었지 만 나는 그렇게 사용하지 않았다. 그러나 RequiredType이 ATrait가있는 BaseType 인 경우에는 작동하지 않습니다. 이 경우 매니페스트 [RequiredType] .runtimeClass는 BaseType으로 설정되고 BaseType은 ATrait로 설정되지 않습니다. – Arun