Scala - 缺少参数类型 - 是否可以避免协助编译器?

时间:2016-12-19 19:36:44

标签: scala types polymorphism

这有效,但我想避免协助编译器,因为我不知道标签类型应该是什么,我只知道它将是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)
}

1 个答案:

答案 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
}