我正在尝试实施一个有特征的项目:
`trait Checkable`
`trait Closeable`
和一个班级:
`case class DBConnection (url: String) extends Checkable with Closeable`
和一个功能
`def generateConnection[T <: Checkable with Closeable](url: String): T = DBConnection(url)`
在编译上面的代码时,它会生成错误:
`Expression of type DBConnection doesn't conform to expected type T_`
我该怎么做才能解决这个问题?
我可以使用表达式:
`DBConnection(url).asInstanceOf[T]`
但我认为这不是最好的做法
答案 0 :(得分:6)
您的方法说它会返回T
,其中T
是Checkable with Closeable
的子类型。但是它返回DBConnection
。如果用户调用使用MyCustomDBConnection
参数化的此方法,该怎么办?她会期望结果相同,相反她会收到你的DBConnection
。
你正在做出一个你无法保留的承诺。最好撤销设置类型T的机会,并承诺您将返回Checkable with Closeable
。然后一切都应该编译好。
def generateConnection(url: String): Checkable with Closeable = DBConnection(url)
如果您仍想使用T
参数化方法,则必须创建一个类型类,它将为T
的不同变体提供不同的实现。您不能每次只返回DBConnection
,因为T
的重点是什么。