Функция, возвращающая наиболее определенный тип

Я хотел бы иметь функцию высшего порядка 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 на самом деле того же типа. Посмотрите тур по Скала для более глубокого объяснения дисперсии.

Другие вопросы по тегам