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

前端之家收集整理的这篇文章主要介绍了Scala覆盖方法,子类为参数类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个特征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 = ...
}

猜你在找的Scala相关文章