Можно ли пролить свет на реальные различия между этими двумя примерами.Параметр неограниченного подстановочного типа против абстрактного типа
object ExampleA {
trait Bar { def n: Int }
trait Foo[B <: Bar] { def bar: B }
def getBarIntFromFoo(foo: Foo[_]) =
getBarInt(foo.bar)
def getBarInt(bar: Bar) =
bar.n
}
object ExampleB {
trait Bar { def n: Int }
trait Foo {
type B <: Bar
def bar: B
}
def getBarIntFromFoo(foo: Foo) =
getBarInt(foo.bar)
def getBarInt(bar: Bar) =
bar.n
}
Я предположил, что единственным отличием было то, как вы обратитесь к ним, но в действительности только ExampleB
компилирует и ExampleA
результаты в:
[error] type mismatch;
[error] found : _$1
[error] required: ExampleA.Bar
[error] getBarInt(_)
[error] ^
Оба Foo
с имеют те же ограничения типа (B <: Bar
), поэтому я немного потерян. Полагаю, я просто недопонимаю что-то довольно основное.
Итак, хотя верхняя граница определена для типа, она все еще компилируется как «Любой», а не «Любой в пределах границ, определенных для типа»? – adlawson
Это правильно. –
Bums. Спасибо за вашу помощь! – adlawson