如何在scala中找到超类型

时间:2016-10-31 02:44:42

标签: scala

如果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}

因为我没有看到所有其他值之间的关系

3 个答案:

答案 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)

我在Fun1Fun2之间唯一可能的关系是它们都是函数,所以我猜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
}