0
votes

I have the following code and will like to call a method on top of a class that implements the trait EventTraces[T] and at the same time T should implement the trait Event (e.g as in 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")
}

However calling doSomethingOnTopOfAnEventTrace(concreteEventTrace) gives me the following error:

Error:(129, 3) inferred type arguments [Nothing,ConcreteEventTrace[ConcreteEvent]] do not conform to method doSomethingOnTopOfAnEventTrace type parameter bounds [T <: Event,Z <: EventTrace[T]] doSomethingOnTopOfAnEventTrace(concreteEventTrace) ^

Error:(129, 38) type mismatch; found : ConcreteEventTrace[ConcreteEvent] required: Z doSomethingOnTopOfAnEventTrace(concreteEventTrace) ^

1

1 Answers

1
votes

The issue is that Scala can't infer T here because it only has Z in the arguments (I don't see a reason it couldn't, in this case). The obvious way to fix it is doSomethingOnTopOfAnEventTrace[ConcreteEvent, ConcreteEventTrace[ConcreteEvent]](concreteEventTrace). Another, if you don't actually need to be generic in Z:

def doSomethingOnTopOfAnEventTrace[T <: Event](eventTrace: EventTrace[T])

You could also try to use type members instead of generics in Event and EventTrace.