如果A<:B,我理解这意味着A是一个子类型而B是一个超类型,我认为我在需要B的地方使用A代替B,因为它从B继承了它的所有属性。现在这是我的问题
type One
type Two
type Three
type Four
type Five
type Six
type Seven
type Eight
type Fun1 = { val a: One } => { val b: Two }
type Fun2 = { val b: Two } => { val a: One }
type SuperType = {
??
}
type TypeOne = {
def apply: { val func: Fun1 ; val c: Three } => { val b: Two ; val d: Four }
val g: Seven
}
type TypeTwo = {
def apply: { val func: Fun2 ; val e: Five } => { val b: Two ; val f: Six }
val h: Eight
}
如何制作SuperType,它是TypeOne和TypeTwo的超类型。 我只能提出关键字'Any'没有其他工作。我也试过
def apply: {val func: Fun1}=>{val b: Two}
因为我没有看到所有其他值之间的关系
答案 0 :(得分:3)
这是获得所需关系的一种方式。
abstract class SuperType
class TypeOne extends SuperType { /* your code here */ }
class TypeTwo extends SuperType { /* etc. */ }
type
关键字主要用于创建类型别名或声明一个抽象类型,稍后将在层次结构链的某个位置具体定义。实际上,您发布的代码并没有真正创建任何内容。您无法实例化任何类型的对象。
type TypeOne <: SuperType
就是你想要的。
答案 1 :(得分:1)
也许这不是你想要的,但这对你有用吗?
sealed trait SuperType
trait TypeOne extends SuperType {
def apply: { val func: Fun1 ; val c: Three } => { val b: Two ; val d: Four }
val g: Seven
}
trait TypeTwo extends SuperType {
def apply: { val func: Fun2 ; val e: Five } => { val b: Two ; val f: Six }
val h: Eight
}
答案 2 :(得分:1)
我在Fun1
和Fun2
之间唯一可能的关系是它们都是函数,所以我猜SuperType
是一个带泛型参数的函数。我试图尽可能地坚持你在你的代码片段中公开的样式(尽管Scala提供了更多惯用的方法来定义类型层次结构)。
type SuperType = {
type A
type B
def apply: { val a: A } => { val b: B }
}
type Fun1 <: SuperType {
type A = One
type B = Two
}
type Fun2 <: SuperType {
type A = Two
type B = One
}