如何为特征的实现分配一个 val?
How can I assign a val with the implementation of a trait?
我有以下特征并且class是:
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 = ???
}
我想创建以下特征和 class:
trait X{
val a: ***
}
class Z extends X{
override val a = new G
}
我需要在特征 X 的 '***' 上写什么,以便我可以为 val a 分配 class F 或 G?
谢谢。
编辑
抱歉,我忘了说特征 A 是 A[Any],特征 F 和 G 可以是 'F extends A[String]' 和 'G extends A[Int]'。换句话说,classes 可以使用不同类型的参数扩展特征 A。
回复。您的编辑,您的代码失败,因为特征 A 仅采用固定类型的类型参数。如果你声明基数 class 有一个 A[Any]
,你不能用 A[Int]
或 A[String]
覆盖它。有两种方法可以使您的代码正常工作。
一个是使 trait A 类型参数 covariant
,这样你就可以用你在基础 class 中声明的类型参数的 subclass 覆盖(注意 +
在特征 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
}
看这里:Sample
另一种工作方式是将 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
}
看这里:Sample
我有以下特征并且class是:
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 = ???
}
我想创建以下特征和 class:
trait X{
val a: ***
}
class Z extends X{
override val a = new G
}
我需要在特征 X 的 '***' 上写什么,以便我可以为 val a 分配 class F 或 G? 谢谢。
编辑
抱歉,我忘了说特征 A 是 A[Any],特征 F 和 G 可以是 'F extends A[String]' 和 'G extends A[Int]'。换句话说,classes 可以使用不同类型的参数扩展特征 A。
回复。您的编辑,您的代码失败,因为特征 A 仅采用固定类型的类型参数。如果你声明基数 class 有一个 A[Any]
,你不能用 A[Int]
或 A[String]
覆盖它。有两种方法可以使您的代码正常工作。
一个是使 trait A 类型参数 covariant
,这样你就可以用你在基础 class 中声明的类型参数的 subclass 覆盖(注意 +
在特征 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
}
看这里:Sample
另一种工作方式是将 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
}
看这里:Sample