这有效,但我想避免协助编译器,因为我不知道标签类型应该是什么,我只知道它将是Field类型。
val x: TypeString = TypeString("test")
TypeValidator.validate[TypeString](x, x => {
true
})
我理想的是:(推断出x类型)
TypeValidator.validate(x, x => {
true
})
验证类如下
import models.implementations.Field
object TypeValidator {
def apply(): TypeValidator = {
new TypeValidator()
}
def validate[T <: Field](t: T, v: T => Boolean): Boolean = {
new TypeValidator().validate(t, v)
}
}
class TypeValidator {
def validate[T <: Field](t: T, v: T => Boolean): Boolean = v.apply(t)
}
在这里搜索了大约一个小时,我得出结论我可能无法避免这种情况,但我仍然希望有人有解决方案。
也许我最接近找到答案的是:
scala anonymous function missing parameter type error
更新 - 只是为了添加,这确实有效,但我觉得可能还有更好的解决方案:
TypeValidator.validate(x)(x => {
true
})
将类更改为ad为匿名函数设置的第二组参数。
class TypeValidator {
def validate[T <: Field](t: T)(v: T => Boolean): Boolean = v.apply(t)
}
答案 0 :(得分:3)
没有比
更好的解决方案了class TypeValidator {
def validate[T <: Field](t: T)(v: T => Boolean): Boolean = v.apply(t)
}
任何其他解决方案都会使validate
的签名不必要地复杂化。
Scala的类型推断器逐个遍历参数列表,所以当它看到旧版本时,它试图从函数参数和T
参数推断Field
,并且因为类型而失败函数参数的说法并不完全清楚。这里,推理器在不考虑函数参数的情况下获取Field
参数,并推断出T = TypeString
。这允许它然后推断出函数参数的参数类型。
你会发现这是整个Scala标准库和基本上所有其他Scala库中非常常见的模式。
此外,您可以而且应该省略函数参数周围的括号:
TypeValidator.validate(x) { x =>
true
}