我相信泛型类可能只使用其类型参数符合一些额外的限制,例如(现场即兴语法),使其方法之一可用:
trait Col[T] extends Traversable[T] {
def sum[T<:Int] :T = (0/:this)(_+_)
}
Run Code Online (Sandbox Code Playgroud)
我想我可以使用隐式参数作为证据......是否有语言功能?
您还可以在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问题.
在这种情况下,您只能使用隐式参数,因为类型是在方法调用之前确定的。
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)