具有通用返回类型的零方法

use*_*261 1 generics types casting scala

我有以下代码应该是工厂类。它的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]
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果未显式进行类型转换,则编译器会报告“ Banking.CheckingAccount类型的表达式不符合预期的类型T”。有人知道为什么吗?

And*_*kin 6

方法签名

def apply[T <: Account]: T 
Run Code Online (Sandbox Code Playgroud)

保证每个 T子类型Account都可以产生一个T

特别是,

Account.apply[Nothing]
Run Code Online (Sandbox Code Playgroud)

应该“返回”的实例Nothing。由于没有的实例,因此Nothing,实现此方法的唯一方法是抛出错误/异常。换句话说,您方法的签名要求的很少,承诺也很多,以至于该方法实际上无法实现。


解决方法1

删除类型参数。返回Account


解决方法2

如果要保留通用返回类型,则可能需要尝试这样的操作:

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]
Run Code Online (Sandbox Code Playgroud)

它可以编译,但是看起来有些多余(调用Account[SavingsAccount]的目的不仅仅是SavingsAccount()什么?)