Scala: การจับคู่รูปแบบกับคลาสเคสทั่วไป

เป็นไปได้หรือไม่ที่จะจับคู่คลาสเคสทั่วไป? แนวคิดคือการใช้คลาสเคสทั่วไปเป็นข้อความระหว่างนักแสดง

นั่นคือแนวทางของฉัน: มีวิธีที่จะทำให้สิ่งนี้เป็นไปได้หรือไม่?

case class EbTreeDataObject[T](uId: Long, changeId: Long, payload:Option[T])
case class InsertNewObject[T](newObject: EbTreeDataObject[T])
case class UpdateObject[T](changedObject: EbTreeDataObject[T])


class TreeActor[T](maxSynchroWait:Int,communication:CommunikationLayer[T]) extends Actor {
  var uIdTree = new EbTree[EbTreeDataObject[T]]
  var changeIdTree = new EbTree[EbTreeDataObject[T]]

  override def receive: Receive = {
    //basic tree operations
    case InsertNewObject(newObject: EbTreeDataObject[T]) =>
       //insert element in tree
    case UpdateObject(newObject: EbTreeDataObject[T]) =>
       //update object
    case RemoveObject(removedObject: EbTreeDataObject[T]) =>
       //remove object

โครงสร้างนี้ทำให้เกิดข้อผิดพลาดขณะรวบรวม:

Error:(32, 37) pattern type is incompatible with expected type;
 found   : model.EbTreeDataObject[T]
 required: model.EbTreeDataObject[Any]
Note: T <: Any, but class EbTreeDataObject is invariant in type T.
You may wish to define T as +T instead. (SLS 4.5)
    case InsertNewObject(newObject: EbTreeDataObject[T]) =>

ขอบคุณสำหรับความช่วยเหลือของคุณ


person prototyp    schedule 22.06.2014    source แหล่งที่มา


คำตอบ (1)


ทำไมคุณไม่ทำตามที่คอมไพเลอร์แนะนำ:

  case class EbTreeDataObject[+T](uId: Long, changeId: Long, payload: Option[T])
person Noah    schedule 22.06.2014
comment
ขอบคุณ แต่ความแตกต่างระหว่าง [+T] และ [T] คืออะไร? - person prototyp; 23.06.2014
comment
[T] หมายถึงอนุญาตเฉพาะประเภทของ 'T' เท่านั้น โดยที่ '[+T]' หมายถึงสิ่งใดก็ตามที่เป็นประเภทย่อยของ T, A <: T นี่เป็นคำถาม SO ที่ดีที่อธิบายรายละเอียดเพิ่มเติม: stackoverflow.com /คำถาม/663254/ - person Noah; 23.06.2014