简体   繁体   中英

Overriding the method of a generic trait in Scala

I defined a generic Environment trait:

trait Environment[T]

For which I provide this implementation:

class MyEnvironment extends Environment[Integer] {
 val specific: Integer = 0
}

Furthermore, I defined a generic Event trait that has one method that accepts a generic Environment as parameter:

trait Event[T] {
  def exec(e: Environment[T])
}

For this Event trait, I provided the following implementation, where the exec() method accepts a parameter of the type MyEnvironment, to enable me to access the specific value of MyEnvironment.

class MyEvent extends Event[Integer] {
  override def exec(e: MyEnvironment): Unit = {
    println(e.specific)
  }
}

However, the Scala compilers outputs an error, from where it seems that MyEnvironment is not recognized as an Environment[Integer]:

Error: method exec overrides nothing.

Note: the super classes of class MyEvent contain the following, non final members named exec: def exec(t: main.vub.lidibm.test.Environment[Integer]): Unit

Is it possible to make this work, or are there patterns to circumvent this problem.

You can't narrow down the signature of a method; it's not the same method any more. In your case, you can't override

def exec(e: Environment[T]): Unit

with

override def exec(e: MyEnvironment): Unit 

Second method is more specific than the first one. It's conceptually the same as eg overriding def foo(a: Any) with def foo(s: String) .

If you want it to work, you need to use the same type in both signatures (note that if you use an upper bound such as T <: Environment[_] , that means that a method that accepts T actually accepts any subclass of Environment , so overriding using MyEnvironment will work OK in that case).

Because overriding is not polymorphic in the method's parameter types. It works the same way as in Java. In the example what you have done is overloaded the method in reality.That is they are treated as different methods.
For overriding the method names ie. the name , signature , types has to be the same.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM