【发布时间】:2013-04-30 02:33:01
【问题描述】:
我正在尝试编写一个简单的查询 monad,但无法让我的 generic 类型注释正确。
我的第一次尝试如下(为了简洁而大大简化)
case class Person( val name: String )
abstract class Schema[T]
object People extends Schema[Person]
case class Query[U <: Schema[T], T]( schema: U ) { <---- Type signature
def results: Seq[T] = ...
def where( f: U => Operation ) = ...
}
class TypeText extends Application {
val query = Query( People ) <---- Type inference fails
}
编译器不喜欢这样,因为它无法推断 'T' 的类型。
错误:推断的类型参数 [People.type,Nothing] 不符合方法应用的类型参数边界 [U <: schema>
在试验时,我发现使用视图边界可以按预期工作
case class Query[U <% Schema[T], T]( schema: U ) {
(注意使用视图绑定“
但是,在我对类型系统的有限理解中,由于我期待 Schema[T] 的实际子类(而不仅仅是可转换性),我会假设类型绑定“<:>
如果是这种情况,我错过了什么 - 在使用类型边界而不是视图边界时,如何给编译器足够的提示以正确推断 T?
【问题讨论】:
标签: scala generics type-inference type-bounds