我想要高阶函数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)
同样有效,但我不想携带另外两个类型参数
答案 0 :(得分:2)
这不能也不应该有效,因为A => A
不是B => B
的子类型(也不是超类型)。原因是Function1在其参数类型中是协变的,在其结果类型中是逆变的。因此,A => A
要成为B => B
的子类型,A
必须是子类型以及超级类型B
。仅当A
和B
实际上是同一类型时才是这种情况。请参阅tour of Scala for a more in depth explanation of variance。