2014-07-07 8 views
0

I가이 T는 생성자의 인자를 가지고해야 배우의 하위 클래스 인 다음 코드 취 일반적인 배우 서브 클래스 만들기 :또한 생성자 매개 변수

abstract class AbstractActor(dest: ActorRef) extends Actor { 
    //... 
} 

class ChildActor(dest: ActorRef) extends AbstractActor(dest) { 
    //... 
} 

class ParentActor[T <: AbstractActor : ClassTag] extends Actor { 
    val childRef = context.actorOf(Props(classOf[T], destActorRef)) 
    //... 
} 

이 컴파일러는 오류를 제공을 "클래스 형식을 필요하지만 T 발견 ".

class ChildActor extends AbstractActor(dest) { 
    //... 
} 

그래서, 시도 :

class ParentActor[T <: AbstractActor : ClassTag] extends Actor { 

    def createT(dest: ActorRef)(implicit ev: Manifest[T]): ActorRef = 
    context.actorOf(Props(ev.runtimeClass, dest)) 

    val childRef = createT(destActorRef) 
    //... 
} 

을하지만 내가 얻을 : 나는 문제가 하나는 생성자 매개 변수없이 childActor를 정의 할 수 있다는 것입니다지지 않는다 "T에 대한 매니페스트 가능". 내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 고마워요

+0

"no manifest available for T"부분에 대해서는이 스레드가 도움이 될 수 있습니다. http://stackoverflow.com/questions/7294761/why-is-the-manifest-not-available-in-the-constructor –

답변

1

첫 번째 시도에서는 classOf[T] 때문에 코드가 실패합니다. classOf에 명시 적 클래스를 지정해야하는 경우 ClassTag이 있어도 형식 매개 변수로는 작동하지 않습니다.

두 번째 시도에서는 T 유형의 경우 ClassTag이 필요하지만 createT의 경우 Manifest이 필요합니다. ManifestClassTag의 하위 유형이며 사용 가능한 ClassTag은 안전하게 Manifest으로 다운 캐스트 할 수 없습니다. 가까운 경우 요구 사항을 [T <: AbstractActor : Manifest]으로 변경하면 코드가 작동합니다.

+0

Manifest가 앞으로 어느 시점에서 사라질 것임을 감안할 때 ClassTag로 대체한다는 함정을 발견 할 수 있을까요? 그래서 우리는'(함축적 인 태그 : ClassTag [T])'그리고 나서'Props (tag.runtimeClass, dest)'를 대신 – Lasf

+1

'ClassTag'로 옮기는 것이 올바른 선택 인 것 같습니다. – wingedsubmariner