我无法处理以下代码:
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参数,那么怎么了?
答案 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}},实际上并不关心类型参数。