【发布时间】:2021-10-12 00:55:39
【问题描述】:
我想使用带有泛型的工厂方法,它可以与特定的实现一起使用。在服务类中我想要类型安全,但在控制器中操作只知道接口。
代码
我已经定义了不同类型的操作类型
trait Transaction {
val amount: BigDecimal
}
case class CreditCardTransaction(amount: BigDecimal, ccNumber: String, expiry: String) extends Transaction
case class BankTransaction(amount: BigDecimal, bankAccount: String) extends Transaction
以及可以使用特定操作类型的服务
trait Service[T <: Transaction] {
def transfer(transaction: T)
}
class CCService() extends Service[CreditCardTransaction] {
override def transfer(transaction: CreditCardTransaction): Unit = println("pay with cc")
}
class TTService() extends Service[BankTransaction] {
override def transfer(transaction: BankTransaction): Unit = println("pay with telex transfer")
}
我已经用具体实例创建了工厂
class PaymentSystemFactory(ccService: CCService, ttService: TTService) {
def getService(paymentMethod: String) = paymentMethod match {
case "cc" => ccService
case "tt" => ttService
}
}
解析器从外部服务获取特定交易
object Parser {
def parse(service: Service[_ <: Transaction]) = service match {
case _: Service[CreditCardTransaction] => CreditCardTransaction(100, "Name", "01/01")
case _: Service[BankTransaction] => BankTransaction(100, "1234")
}
}
但由于提供的类型与 PaymentSystemFactory 方法不匹配,该代码不想编译:
object App {
val factory = new PaymentSystemFactory(new CCService, new TTService)
val service = factory.getService("cc") // return Service[_ >: CreditCardTransaction with BankTransaction <: Transaction]
val transaction: Transaction = Parser.parse(service)
service.transfer(transaction) // Failed here: Required _$1 found Transaction
}
如果可能由于工厂方法调用,我很乐意避免类型擦除,并想知道为什么该代码不起作用
【问题讨论】:
标签: scala generics factory factory-pattern