Дано:Тип Параметры в `абстрактном class`
scala> abstract class Foo[A] {
| def f: A
| }
defined class Foo
, и реализация
scala> class FooImpl extends Foo[Any] {
| def f: Any = "foo"
| }
defined class FooImpl
и затем конкретизация
scala> new FooImpl().f
res0: Any = foo
res0
имеет тип Any
, как я хотел ожидать, поскольку FooImpl
использует Any
в качестве параметра своего типа до Foo
.
И дали вторую реализацию:
scala> class FooImpl2 extends Foo[Any] {
| override def f= "foo"
| }
defined class FooImpl2
и экземпляра и призыв к f
:
scala> new FooImpl2().f
res1: String = foo
Почему res1
«s введите String
?
Принимая во внимание, учитывая:
scala> def g[A](x: A):A = x
g: [A](x: A)A
я могу передать y
, Int
:
scala> val y: Int = 55
y: Int = 55
к g
scala> g[AnyVal](y)
res3: AnyVal = 55
и вернуться к AnyVal
.
Наконец,
scala> g(55)
res5: Int = 55
возвращает Int
, как и ожидалось.
Однако, я бы ожидал FooImpl2#f
, что возвратил Any
данные FooImpl2
«S extends Foo[Any]
.
Почему нет?
Стоит отметить, что это возможно и в Java (но только после введения ковариантных типов возврата в Java 5), а в Scala и Java это приводит к двум методам на уровне JVM: более конкретным один и синтетический метод, соответствующий внедренной сигнатуре. –