具有类型参数限制的Scala泛型类的条件方法

Tur*_*rin 6 generics scala

我相信泛型类可能只使用其类型参数符合一些额外的限制,例如(现场即兴语法),使其方法之一可用:

trait Col[T] extends Traversable[T] {
    def sum[T<:Int] :T = (0/:this)(_+_)
}
Run Code Online (Sandbox Code Playgroud)

我想我可以使用隐式参数作为证据......是否有语言功能?

Rea*_*ame 7

您还可以在type参数上使用绑定类型,该参数由隐式参数强制执行:

trait Col[T] extends Traversable[T] {
    def sum(implicit ev: T <:< Int) :T = (0/:this)(_+_)
}
Run Code Online (Sandbox Code Playgroud)

<:<实际上是一个用inix符号表示的类,在Predef.scala中定义并在很多地方解释,包括这里

<:< 意思是'必须是'的子类型'

您还可以使用=:='必须等于'和X <%< Y'必须可以查看'(即从Y中隐式转换为X)

有关类型约束的更详细说明,请参阅此SO问题.


dre*_*xin 4

在这种情况下,您只能使用隐式参数,因为类型是在方法调用之前确定的。

trait Col[T] extends Traversable[T] {
  def sum(implicit num: Numeric[T]) :T = ???
}
Run Code Online (Sandbox Code Playgroud)

如果您调用的方法将被参数化,则可以使用上下文边界,这只是绑定到类型参数的隐式参数的语法糖:

def foo[A](implicit ev: Something[A]) = ???
Run Code Online (Sandbox Code Playgroud)

相当于

def foo[A : Something] = ???
Run Code Online (Sandbox Code Playgroud)