Scala:返回参数化实例

时间:2018-08-07 16:10:23

标签: scala generics inheritance traits

我无法处理以下代码:

object Factory {
  def apply[U <: Cda](type: MyType.Value): MyUtilTrait[U] = {
    type match {
      case MyType.Value.one => MyOneUtilCustom
      case MyType.Value.two => MyTwoUtilCustom
    }
  }
}

=>类型为Factory.MyType的表达式不符合预期的类型MyUtilTrait [U]

trait MyUtilTrait[T <: Cda] {}

object MyOneUtilCustom extends MyUtilTrait[CdaOneCustom] { }
object MyTwoUtilCustom extends MyUtilTrait[CdaTwoCustom] { }

case class CdaOneCustom(...) extends Cda {}
case class CdaTwoCustom(...) extends Cda {}

abstract class Cda(...) {}

object MyType extends Enumeration {
  val one, two = Value
 }

通过应用,我应该返回一个带有Cda子类型的MyUtilTrait参数,那么怎么了?

1 个答案:

答案 0 :(得分:1)

用这样的签名 [1] 来实现这种class Comment(models.Model): created_date = models.DateTimeField() comment = models.CharField(max_length=500, default='', blank=True) user = models.ForeignKey(UserProfile, on_delete=models.CASCADE) post =models.ForeignKey(Post,related_name='comments',on_delete=models.CASCADE) 方法几乎是完全不可能的,因为有人可能会来定义

apply

然后调用

class Unobtanium extends Cda {
  // implement all `Cda` methods by `???`
}

如果工厂对Factory.apply[Unobtanium](MyType.one) 一无所知,那么工厂应该如何创建MyUtilTrait[Unobtanium],这是它第一次看到这种奇怪的类型?

改为使用存在性类型:

Unobtanium

[1] 除非您的abstract class Cda {} case class CdaOneCustom() extends Cda {} case class CdaTwoCustom() extends Cda {} trait MyUtilTrait[T <: Cda] {} object MyOneUtilCustom extends MyUtilTrait[CdaOneCustom] { } object MyTwoUtilCustom extends MyUtilTrait[CdaTwoCustom] { } object MyType extends Enumeration { val one, two = Value } object Factory { def apply(typ: MyType.Value): MyUtilTrait[_] = { import MyType._ typ match { case `one` => MyOneUtilCustom case `two` => MyTwoUtilCustom } } } 很琐碎,例如MyUtilTrait[X](对于任何Nil来说都是List[X]),或{ {1}},实际上并不关心类型参数。