加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用子类参数覆盖子类方法?

发布时间:2020-12-16 19:01:03 所属栏目:安全 来源:网络整理
导读:当由子类覆盖时,如何强制基本方法接受相同的特定子类实例? 即: abstract class Animal { def mateWith(that: Animal)}class Cow extends Animal { override def mateWith...?} 从逻辑上讲,牛应该只能与另一头牛交配.但是,如果我覆盖def mateWith(that:Cow
当由子类覆盖时,如何强制基本方法接受相同的特定子类实例?

即:

abstract class Animal {
  def mateWith(that: Animal)
}

class Cow extends Animal {
  override def mateWith...?
}

从逻辑上讲,牛应该只能与另一头牛交配.但是,如果我覆盖def mateWith(that:Cow),这实际上并没有覆盖基类方法(我想要它,因为我想强制它在子类中存在)??.

我可以检查以确保其他实例是Cow类型,并且如果不是则抛出异常 – 这是我最好的选择吗?如果我有更多的动物怎么办?我将不得不重复抛出异常的代码.

解决方法

abstract class Animal[T <: Animal[T]] {
  def mateWith(that: T)
}

class Cow extends Animal[Cow] {
  override def mateWith(that: Cow) { println("cow") }
}

class Dog extends Animal[Dog] {
  override def mateWith(that: Dog) { println("dog") }
}

并像这样使用它:

scala> (new Cow).mateWith(new Cow)
cow

scala> (new Cow).mateWith(new Dog)
<console>:17: error: type mismatch;
 found   : Dog
 required: Cow
              (new Cow).mateWith(new Dog)
                                 ^

不需要抛出异常代码;类型系统在编译时为您处理它!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读