Scala多种类型一致性

时间:2014-10-24 11:38:59

标签: scala type-inference

我有以下代码,并且希望在实现特征EventTraces [T]的类之上调用方法,同时T应该实现特征事件(例如在doSomethingOnTopOfAnEventTrace()中)

trait Event
class ConcreteEvent[T <: Event]
trait EventTrace[T <: Event]
class ConcreteEventTrace[T <: Event] extends EventTrace[T]

val concreteEventTrace : ConcreteEventTrace[ConcreteEvent] = new ConcreteEventTrace(new ConcreteEvent)

def doSomethingOnTopOfAnEventTrace[T <: Event, Z <: EventTrace[T]](eventTrace: Z) {
    println("Action on top of a Any kind of EventTrace of any type of Event")
}

但是,调用doSomethingOnTopOfAnEventTrace(concreteEventTrace)会出现以下错误:

  

错误:(129,3)推断类型参数[Nothing,ConcreteEventTrace [ConcreteEvent]]不符合方法doSomethingOnTopOfAnEventTrace类型参数bounds [T&lt;:Event,Z&lt;:EventTrace [T]]     doSomethingOnTopOfAnEventTrace(concreteEventTrace)     ^

     

错误:(129,38)类型不匹配;   发现:ConcreteEventTrace [ConcreteEvent]   要求:Z   doSomethingOnTopOfAnEventTrace(concreteEventTrace)                                        ^

1 个答案:

答案 0 :(得分:1)

问题在于Scala无法在此推断T,因为它在论证中只有Z(我没有看到它无法解决的原因。 t ,在这种情况下)。解决这个问题的显而易见的方法是doSomethingOnTopOfAnEventTrace[ConcreteEvent, ConcreteEventTrace[ConcreteEvent]](concreteEventTrace)。另一方面,如果你实际上不需要在Z

中具有通用性
def doSomethingOnTopOfAnEventTrace[T <: Event](eventTrace: EventTrace[T])

您还可以尝试在EventEventTrace中使用类型成员而不是泛型。