我有以下代码,应该是工厂类。它的apply方法具有用于返回类型限制的通用参数:
sealed trait Account
final case class CheckingAccount() extends Account
final case class SavingsAccount() extends Account
object Account {
def apply[T <: Account]:T = {
CheckingAccount() // CheckingAccount().asInstanceOf[T]
}
}
但是,如果未明确进行类型转换,则编译器将报告“ Banking.CheckingAccount类型的表达式不符合预期的类型T”。有人知道为什么吗?
方法签名
def apply[T <: Account]: T
保证每个 T
子类型Account
都可以产生一个T
。
特别是,
Account.apply[Nothing]
应该“返回”的实例Nothing
。由于没有的实例,因此Nothing
,实现此方法的唯一方法是抛出错误/异常。换句话说,方法的签名要求的很少,承诺的也很多,以至于该方法实际上无法实现。
删除类型参数。返回Account
。
如果要保留通用返回类型,则可能需要尝试这样的操作:
sealed trait Account
final case class CheckingAccount() extends Account
final case class SavingsAccount() extends Account
trait Default[X] {
def createDefault: X
}
implicit object DefaultCheckingAccount extends Default[CheckingAccount] {
def createDefault = CheckingAccount()
}
implicit object DefaultSavingsAccount extends Default[SavingsAccount] {
def createDefault = SavingsAccount()
}
object Account {
def apply[T <: Account](implicit d: Default[T]): T = d.createDefault
}
Account[SavingsAccount]
Account[CheckingAccount]
它可以编译,但是看起来有些多余(调用Account[SavingsAccount]
的目的不仅仅是SavingsAccount()
什么?)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句