我有一个特征A有一个方法def fun1(b:B):C
我希望A的子类实现B具有更详细的类型:
我希望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 => ... } }
此方法无法在编译期间检查正确的类型.我怎样才能实现第一次实施?
有没有设计模式来处理这个问题?
解决方法
您可以使用泛型类型参数执行此操作.
trait A[T <: B] { def fun1( t:T ):C } class X1 extends A[B1]{ override def fun1(b:B1):C1 = ... }