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

Scala覆盖方法,子类为参数类型

发布时间:2020-12-16 18:06:38 所属栏目:安全 来源:网络整理
导读:我有一个特征A有一个方法def fun1(b:B):C 我希望A的子类实现B具有更详细的类型: 这是代码: trait Btrait Ctrait A { def fun1( b:B ):C}class B1 extends B{}class B2 extends B{}class C1 extends C{}class C2 extends C{} 我希望A的子类可以声明如下 c
我有一个特征A有一个方法def fun1(b:B):C
我希望A的子类实现B具有更详细的类型:

这是代码:

trait B
trait C

trait A {
  def fun1( b:B ):C
}

class B1 extends B{
}

class B2 extends B{
}


class C1 extends C{
}

class C2 extends C{
}

我希望A的子类可以声明如下

class X1 extends A{
    override def fun1(b:B1):C1 = ...
}


class X2 extends A{
    override def fun1(b:B2):C2 = ...
}

但是,编译器会抱怨X1不会覆盖任何内容.
我必须手动匹配详细的B类型,如下所示.

class X1 extends A{
    override def fun1(b:B):C = b match {case x:B1 => ... }
}


class X2 extends A{
    override def fun1(b:B2):C2 = b match {case x:B2 => ... }
}

此方法无法在编译期间检查正确的类型.我怎样才能实现第一次实施?
有没有设计模式来处理这个问题?

一个类似的问题是C# Override method with subclass parameter

解决方法

您可以使用泛型类型参数执行此操作.

trait A[T <: B] {
   def fun1( t:T ):C
}

class X1 extends A[B1]{
    override def fun1(b:B1):C1 = ...
}

(编辑:李大同)

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

    推荐文章
      热点阅读