我有以下代码,并且希望在实现特征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) ^
答案 0 :(得分:1)
问题在于Scala无法在此推断T
,因为它在论证中只有Z
(我没有看到它无法解决的原因。 t ,在这种情况下)。解决这个问题的显而易见的方法是doSomethingOnTopOfAnEventTrace[ConcreteEvent, ConcreteEventTrace[ConcreteEvent]](concreteEventTrace)
。另一方面,如果你实际上不需要在Z
:
def doSomethingOnTopOfAnEventTrace[T <: Event](eventTrace: EventTrace[T])
您还可以尝试在Event
和EventTrace
中使用类型成员而不是泛型。