给出以下Scala定义
abstract class C {
type T1 <: { def m() : Int }
type T2 <: { def n() : Int }
}
有没有办法在C中定义第三种类型,它被限制为T1和T2的子类型? E.g。
type T3 <: T1 & T2 // does not compile
在我看来,(部分原因)这不起作用的原因是我不能确定这不会导致非法约束(例如从两个类继承)。因此,一个相关的问题是,如果我可以约束T1和T2,以便这是合法的,例如,要求它们都是特质。
答案 0 :(得分:11)
这可以满足您的需求吗?
type T3 <: T1 with T2
这不需要T1
和T2
都是特征 - 例如,您可以使用一个特征和一个类来创建有效的实现(哪个是哪个是无关紧要的)
如果您尝试定义C
的具体子类型,其中T1
和T2
都是类,那么它将无法编译,因此我不担心在约束中强制执行此操作。
答案 1 :(得分:7)
当然可以,但类型交集用写,而不是&amp; 。
abstract class C {
type T1 <: { def m() : Int }
type T2 <: { def n() : Int }
type T3 <: T1 with T2
}
class X extends C {
trait T1 {def m(): Int}
class T2 {def n(): Int = 3}
class T3 extends T2 with T1 {def m(): Int = 5}
}
如果T1和T2恰好都是类,那么你将无法进行具体的实现