2015-04-02 3 views
0

У меня этот прецедент я не могу решить. Я думал о среде для программирования передачи сообщений. Существуют две основные концепции: Вещи и окружающая среда: Вещи, как в реальном мире. Они могут быть пассивными или активными, и они могут отправлять и получать сообщения. Окружающая среда позволяет общаться между вещами. я пришел к этому решению:Проверка класса Scala во время выполнения

/**** Thing.scala ****/

abstract class Thing(environment : Environment){ 
    val uniqueName : String 
    require(environment != null) 
} 

/**** ActiveThing.scala ****/

trait ActiveThing extends Thing { 
    environment.register(this) 
    type inputType 
    type outputType 
    def receiveMessage(message : Message[inputType]) : outputType 
    def canReceiveMessage(subject : String) : Boolean 
}  

/**** **** Environment.scala/

trait Environment { 
    private var _passiveThings = List[PassiveThing]() 
    private var _activeThings = List[ActiveThing]() 

    def activeThings = _activeThings.toSeq 
    def passiveThings = _passiveThings.toSeq 
    def register(p : PassiveThing) = _passiveThings +:= p 
    def register(a : ActiveThing) = _activeThings +:= a 
    def unicastRequest[T,K](from : String, message : Message[T], to : String) : K 
} 

/**** **** Message.scala/

case class Message[T](subject : String, body : T) 

Но когда я пытаюсь реально выполнить:

/**** EchoActiveThing.scala ****/

class EchoActiveThing(implicit inj: Injector) extends Thing()(inj) with ActiveThing { 
    type inputType = String 
    type outputType = String 
    val uniqueName : String = "Echo" 
    def receiveMessage(message : Message[inputType]) : outputType = { 
    message.body 
    } 
    def canReceiveMessage(subject : String) : Boolean = { 
    true 
    } 
} 

/**** BasicEnvironment.scala ****/

class BasicEnvironment extends Environment { 
    def unicastRequest[T,K](from : String, message : Message[T], to : String) : K = { 
    activeThings.filter{ x => 
     x.inputType == T && 
     x.outputType == K && 
     x.canReceiveMessage(message) && 
     activeThings.contains(to.uniqueName) 
    } 
    } 
} 

Но это не скомпилировать. Я думаю, что я не подхожу к проблеме правильно! Спасибо

ответ

1

x.inputType - это проекция типа, а не переменная. Его нельзя сравнивать с ==, поэтому код не компилируется. Для сравнения типов во время выполнения вы можете использовать TypeTag[T]

case class Holder[T](t: T) 

def areEqualTypes[A, B](a: Holder[A], b: Holder[B]) 
         (implicit tagA: TypeTag[A], tagB: TypeTag[B]) = { 
    tagA == tagB 
} 

val (h1, h2, h3) = (Holder("Foo"), Holder("Bar"), Holder(5)) 
println(areEqualTypes(h1, h1)) //true 
println(areEqualTypes(h1, h2)) //true 
println(areEqualTypes(h1, h3)) //false 

В примере теги типа неявно передается вместе с параметрами функции. На этот раз вы можете использовать ==, потому что tagA и tagB являются экземплярами TypeTag[A] и TypeTag[B] классов.

Смежные вопросы