具有多种类型的Scala类型参数作为函数的结果

时间:2018-03-07 14:46:21

标签: scala

我正在尝试实施一个有特征的项目:

`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]`

但我认为这不是最好的做法

1 个答案:

答案 0 :(得分:6)

您的方法说它会返回T,其中TCheckable with Closeable的子类型。但是它返回DBConnection。如果用户调用使用MyCustomDBConnection参数化的此方法,该怎么办?她会期望结果相同,相反她会收到你的DBConnection

你正在做出一个你无法保留的承诺。最好撤销设置类型T的机会,并承诺您将返回Checkable with Closeable。然后一切都应该编译好。

def generateConnection(url: String): Checkable with Closeable = DBConnection(url)

如果您仍想使用T参数化方法,则必须创建一个类型类,它将为T的不同变体提供不同的实现。您不能每次只返回DBConnection,因为T的重点是什么。