我有以下特征和类别:
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
}
参见此处:样品