2016-06-23 2 views
0

저는 Actor 클래스를 받아들이고 스폰하는 스폰 함수를 작성하려고합니다. 여기에 내가 가지고있는 것 :클래스 유형의 스폰 대상 스폰?

object entities { 
    val system = ActorSystem("Entities") 

    def spawnEntity(entity : Actor) = { 
     system.actorOf(Props[entity]) 
} 

여기에 어떤 형식의 엔터티가 있는지 알 수 없다는 것을 이해할 수 있습니다. 그러나 나는 또한 classOf(entity)entity.class을 시도했으나 제대로 작동하지 않았습니다.

어떻게 이런 액터를 생성 할 수 있습니까? 욕망 기능은 다음과 같습니다.

entities.spawnEntity(Bird) 
entities.spawnEntity(Rabbit(/* params here * /) 

새와 토끼는 액터입니다.

EDIT : Bird와 Rabbit을 클래스가 아닌 객체로 간주합니다. 내 실수.

답변

2

PropsClass 또는 Actor를 생성하기 위해 ClassTag 필요하지만 entity은 (코드가 현재 기록 된대로)를 Actor의 인스턴스 있어야한다. 무엇 원하는입니다 서명은 entity: Class[_ <: Actor]입니다.

또는 대신 spawnEntity의 구현에서 사용하려고하는 유형 매개 변수를 사용할 수 있습니다.

import scala.reflect.ClassTag 

def spawnEntity[Entity <: Actor: ClassTag] = system.actorOf(Props[Entity]) 

spawnEntity 이제 ClassTag[Entity]가 컴파일러에 의해 생성 될 수 Actor의 (상기 경계 또는 동일한 유형)을 서브 타입이어야 Entity 불리는 한 종류의 매개 변수로 매개 변수없는 방법이다.

사용법 :

entities.spawnEntity[Bird] 

그 인스턴스가 아닌 클래스이기 때문에,하지만 작동하지 않습니다 Rabbit(/* params here * /) 같은 것을 사용.

+0

깔끔하고 잘 작동합니다. 나는 틀린 물건에 관해 묻고 있었다고 생각한다. 개체가 클래스가 아니라 객체라고 가정 해 봅시다. 그럼 어떻게 할거 니? 사용법은 entities.spawnEntity (Bird)입니다. 이상적으로는 논증도 전달할 수 있습니다. 새로운 이해를 반영하기 위해 질문을 수정하겠습니다. – Stradigos