Функция, возвращающая наиболее определенный тип
Я хотел бы иметь функцию высшего порядка Function[K=>V, K=>V]
который принимает функцию K=>V
и возвращает тип данной функции. Например, я хотел бы иметь следующее поведение:
class Foo[K, V]() {
def apply[K1 <: K, V1 <: V](f: K1 => V1) = f
}
// dummy class hierachy
class A
class B extends A
class C extends B
// a function f: B=>B
def f(some: B): B = some
// the desired result
val result1: B => B = new Foo[A, A]()(f)
Применяемый метод Foo
занимает B=>B
и возвращает B=>B
, Тип-параметры K
а также V
следить за "самым высоким" типом Foo
можно принять в качестве аргумента. Теперь я хотел бы Foo
Расширить функцию как
class Bar[K, V] extends Function[K=>V, K=>V]() {
def apply(f: K => V) = f
}
val result2: B => B = new Bar[A, A]()(f)
однако это, очевидно, не работает. Есть ли способ сделать эту работу? Спасибо
редактировать
class Fuzz[K, V, K1 <: K, V1 <: V] extends Function[K1=>V1, K1=>V1] {
def apply(f: K1 => V1) = f
}
val result3: B => B = new Fuzz[A, A, B, B]()(f)
Также работает, однако я не хочу нести два дополнительных параметра типа
1 ответ
Это не может и не должно работать, потому что A => A
не является подтипом B => B
(и не супертип тоже). Причина этого заключается в том, что Function1 является ковариантным по своему типу аргумента и контравариантным по своему типу результата. Таким образом, для A => A
быть подтипом B => B
, A
должен быть подтипом, а также супертип B
, Это только в том случае, если A
а также B
на самом деле того же типа. Посмотрите тур по Скала для более глубокого объяснения дисперсии.