【发布时间】:2020-09-19 06:24:25
【问题描述】:
我有一个函数 exec,它接受 3 个参数并将函数 f 作为第一个参数传递给其他两个 - p1 和 p2。
def exec[T](f: (T, T) => Boolean, p1: T, p2: T) = f(p1, p2)
如果我提前声明一个将作为参数传递的函数,一切正常。
编译器可以以某种方式推断eq 的参数的类型,或者换句话说,它可以确定whatever 在这种情况下是Int
// declaring a function with type parameter (polymorphic method)
def eq[whatever](p1: whatever, p2: whatever) = p1 == p2
// using a declared function
println(exec(eq, 10, 10))
如果我明确指定Int,它也可以正常工作,如下所示
// specifying type explicitly in function literal
println(exec((p1: Int, p2: Int) => p1 == p2, 10, 10))
// specifying type parameter
println(exec[Int]((p1, p2) => p1 == p2, 10, 10))
问题 1
是否有可能低于工作?
println(exec((p1, p2) => p1 == p2, 10, 10))
例如,通过使用隐式、以不同方式定义 exec 或使用其他方式使编译器能够推断 p1 和 p2 的类型,这样它就不会因 missing parameter type 而失败。
因此没有使用显式类型提示或声明的方法。
问题 2
编译器如何推断eq 的类型以及为什么它适用于p1 == p2 或p1 != p2 这样的表达式,但对于p1 >= p2 却失败了(错误是value >= is not a member of type parameter whatever)?
【问题讨论】:
标签: scala generics type-inference