如何在实现特性的情况下分配val



我有以下特征和类别:

trait A{
def func1: String
def func2: Int
}
class F extends A{
def func1: String = ???
def func2: Int = ???
}
class G extends A{
def func1: String = ???
def func2: Int = ???
}

我想创建以下特性和类:

trait X{
val a: ***
}
class Z extends X{
override val a = new G
}

我需要在特征X中的"***"上写些什么,这样我就可以给vala分配F或G类了?非常感谢。

编辑

对不起,我忘了提到特征A是A[Any],特征F和G可以是"F扩展A[String]"one_answers"G扩展A[Int]"。换句话说,类可以用不同类型的参数来扩展特征A。

Re。您的编辑,您的代码失败,因为特征A只接受固定类型的类型参数。如果声明基类具有A[Any],则不能用A[Int]A[String]重写它。有两种方法可以使代码正常工作。

一种是使trait A的类型参数为covariant,这样您就可以用基类中声明的类型参数的子类重写(注意trait A定义中的+(:

trait A[+T]
class F extends A[String]
class G extends A[Int]

trait X {
val a: A[Any]
}

class Z extends X {
val a = new G
}

参见此处:样品

另一种工作方式是将a声明为A[_](_表示它将任何类型作为参数,这与Any不同(:

trait A[T]
class F extends A[String]
class G extends A[Int]

trait X {
val a: A[_]
}

class Z extends X {
val a = new G
}

参见此处:样品

相关内容

最新更新