Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 从嵌套类型获取子类型_Scala - Fatal编程技术网

Scala 从嵌套类型获取子类型

Scala 从嵌套类型获取子类型,scala,Scala,我看不到获得嵌套类型的子类型的方法,有可能吗 type IN[A,B] = { type X = A type Y = B } trait INH[IN[A,B]] { type X = IN#X type Y = IN#Y } 但这并没有编译 更新 我将扩展这个案例: 有一些类:A、B、C、N——它们是状态,我想实现路径可靠对象: C-只能从A或B初始化 D-只能从A或B或C初始化 抽象类状态 没有什么 键入!![S]=![![S]] 类型∨[T,U]=![![T]与![

我看不到获得嵌套类型的子类型的方法,有可能吗

type IN[A,B] = {
  type X = A
  type Y = B
}

trait INH[IN[A,B]] {
  type X = IN#X
  type Y = IN#Y 
}
但这并没有编译

更新 我将扩展这个案例:
有一些类:A、B、C、N——它们是状态,我想实现路径可靠对象:

  • C-只能从AB初始化
  • D-只能从ABC初始化
  • 抽象类状态
    没有什么
    键入!![S]=![![S]]
    类型∨[T,U]=![![T]与![U]]
    
    类型|∨|[T,U]={typeλ[X]=!![X]您必须按照以下方式执行:

    trait IN[A, B] {
      type X = A
      type Y = B
    }
    
    trait INH[T <: IN[_, _]] {
      type X = T#X
      type Y = T#Y
    }
    
    [A,B]中的特征{ X型=A型 类型Y=B }
    你必须按照以下方法来做:

    trait IN[A, B] {
      type X = A
      type Y = B
    }
    
    trait INH[T <: IN[_, _]] {
      type X = T#X
      type Y = T#Y
    }
    
    [A,B]中的特征{ X型=A型 类型Y=B }
    talex的答案是正确的,但是请注意,在Scala 3中,这种对抽象类型成员的类型投影是不允许的(2020年之前不会出现)

    您的用例似乎有点奇怪,为什么不在
    中简单地声明

    trait IN {
        type A
        type B
    }
    
    然后,您可以直接作为#A
    中的
    访问
    A
    ,或者,最好是在Scala 3中允许,通过
    IN
    中的
    作为
    IN.A
    访问
    中的
    实例

    如果希望能够以简洁的方式约束
    A
    B
    或两者,可以使用类型细化并定义别名:

    type INWithSpecificA[+AA] = IN {
        type A <: AA
    }
    
    类型INWithSpecificA[+AA]=IN{
    
    类型Atalex的答案是正确的,但请注意,Scala 3中不允许对抽象类型成员进行这种类型投影(2020年之前不会出现)

    您的用例似乎有点奇怪,为什么不在
    中简单地声明

    trait IN {
        type A
        type B
    }
    
    然后,您可以直接作为#A
    中的
    访问
    A
    ,或者,最好是在Scala 3中允许,通过
    IN
    中的
    作为
    IN.A
    访问
    中的
    实例

    如果希望能够以简洁的方式约束
    A
    B
    或两者,可以使用类型细化并定义别名:

    type INWithSpecificA[+AA] = IN {
        type A <: AA
    }
    
    类型INWithSpecificA[+AA]=IN{
    
    键入A
    为什么不简单地在中声明为
    -我猜OP创建此项是为了解决类型擦除问题。
    为什么不简单地在中声明为
    -我猜OP创建此项是为了解决类型擦除问题。