Scala中具有继承返回类型的集合的最小框架
发布时间:2020-12-16 09:23:39 所属栏目:安全 来源:网络整理
导读:假设想要构建一个新颖的泛型类,小说[A].这个类将包含很多有用的方法 – 也许它是一种类型的集合,因此你需要对它进行子类化.但是您希望方法返回子类的类型,而不是原始类型.在Scala 2.8中,最小的工作量是多少,这个类的方法将返回相关的子类,而不是原始的?例如
假设想要构建一个新颖的泛型类,小说[A].这个类将包含很多有用的方法 – 也许它是一种类型的集合,因此你需要对它进行子类化.但是您希望方法返回子类的类型,而不是原始类型.在Scala 2.8中,最小的工作量是多少,这个类的方法将返回相关的子类,而不是原始的?例如,
class Novel[A] /* What goes here? */ { /* Must you have stuff here? */ def reverse/* What goes here instead of :Novel[A]? */ = //... def revrev/*?*/ = reverse.reverse } class ShortStory[A] extends Novel[A] /* What goes here? */ { override def reverse: /*?*/ = //... } val ss = new ShortStory[String] val ss2 = ss.revrev // Type had better be ShortStory[String],not Novel[String] 如果你想让小说变得一致,这个最小的数量是否会改变? (2.8集合这样做除了其他的东西之外,他们也玩更多的幻想(和有用的)方式返回类型 – 问题是,如果只有这个子类型 – 总是返回子类型特征.) 编辑:假设在上面的代码中,反向复制.如果有人进行就地修改,然后返回自己,可以使用this.type,但是不起作用,因为副本不是这样的. Arjan链接到另一个提出以下解决方案的问题: def reverse: this.type = { /*creation of new object*/.asInstanceOf[this.type] } 这基本上在于类型系统,以获得我们想要的.但是这并不是一个真正的解决方案,因为现在我们已经对类型系统了,编译器无法帮助我们确保在我们认为我们这样做的时候我们真的会得到一个ShortStory. (例如,我们不必在上面的示例中覆盖reverse,使编译器变得快乐,但是我们的类型不会是我们想要的.) 解决方法
我完全没有想过这个,但是键入检查:
object invariant { trait Novel[A] { type Repr[X] <: Novel[X] def reverse: Repr[A] def revrev: Repr[A]#Repr[A] = reverse.reverse } class ShortStory[A] extends Novel[A] { type Repr[X] = ShortStory[X] def reverse = this } val ss = new ShortStory[String] val ss2: ShortStory[String] = ss.revrev } object covariant { trait Novel[+A] { type Repr[X] <: Novel[_ <: X] def reverse: Repr[_ <: A] def revrev: Repr[_ <: A]#Repr[_ <: A] = reverse.reverse } class ShortStory[+A] extends Novel[A] { type Repr[X] = ShortStory[X] def reverse = this } val ss = new ShortStory[String] val ss2: ShortStory[String] = ss.revrev } 编辑 共同版本可以更好: object covariant2 { trait Novel[+A] { type Repr[+X] <: Novel[X] def reverse: Repr[A] def revrev: Repr[A]#Repr[A] = reverse.reverse } class ShortStory[+A] extends Novel[A] { type Repr[+X] = ShortStory[X] def reverse = this } val ss = new ShortStory[String] val ss2: ShortStory[String] = ss.revrev } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |