То, что вы просите сделать, выглядит примерно так:
trait Foo {
def foo[T <: MyBaseConfiguration](config: T) = {
println("do smething")
println(config.configValue)
}
}
class Foo2 extends Foo {
override def foo[T <: MyOtherConfiguration](c: T) = {
println("do smething else")
println(c.configValue)
println(c.otherValue)
}
}
Однако это не сработает , поскольку нарушает безопасность типов.Рассмотрим следующее:
class MyThirdConfiguration extends MyBaseConfiguration {...}
val foo2: Foo = new Foo2
val cfg: MyBaseConfiguration = new MyThirdConfiguration
foo2.foo(cfg)
foo2
является экземпляром Foo2
, но выглядит как Foo
.cfg
является экземпляром MyThirdConfiguration
, но выглядит как MyBaseConfiguration
.Так что foo2.foo(cfg)
вызывает Foo2.foo
с объектом, который не является MyOtherConfiguration
и не имеет дополнительных полей, даже если типы совпадают.
Обратите внимание, что Foo2.foo
может быть определено для получения суперкласс из MyBaseConfiguration
, поскольку это не нарушит безопасность типов.
Также обратите внимание, что типы результатов для перегруженных функций работают наоборот.Вы можете вернуть подкласс типа, возвращаемого базовой функцией, но не суперкласс, поскольку первый является безопасным типом, а второй - нет.