【问题标题】:Nested trait in class constructor in scalascala中类构造函数中的嵌套特征
【发布时间】:2010-09-03 01:56:46
【问题描述】:

我正在玩 scala (scala 2.8)。假设我有一个具有嵌套特征的类,并且想要使用该嵌套特征作为类构造函数中参数的类型。这甚至可能吗?这是我最近的一次:

class OuterClass(traitParam:OuterClass#InnerTrait) {
  trait InnerTrait { }
  val y:InnerTrait = traitParam
}

没有甚至编译的第三行,但是当我尝试实际使用 traitParam 作为 InnerTrait 时,我得到一个编译器错误:

类型不匹配;找到:OuterClass#InnerTrait 需要:OuterClass.this.InnerTrait。

我不知道我能做什么(如果有的话)。在做

class OuterClass(traitParam:OuterClass.this.InnerTrait)

相反,正如错误消息所暗示的那样,它不会编译。除了将InnerTrait 移到OuterClass 之外,我还有其他选择吗?如果您想知道我为什么要这样做,答案是在我的实际代码中,OuterClass 的等价物具有类型参数,然后将在InnerTrait 中使用。如果我把它移到外面,那么我每次引用内部特征时都必须重新声明类型参数。

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

    您遇到了 Scala 的依赖于路径的类型。您的val y: InnerTrait 的类型特定于它所在的实例。 OuterClass#InnerTrait 是所有OuterClass 实例的现有InnerTrait 的超类型。

    尝试使用这个:

    class OuterClass(traitParam: OuterClass#InnerTrait) {
        trait InnerTrait { }
    
        type IT = OuterClass#InnerTrait
    
        def m1: IT = traitParam
    }
    

    【讨论】:

      【解决方案2】:

      OuterClass 有类型参数 然后将在 InnerTrait 中使用

      所以有可能有a: OuterClassb: OuterClass 这样这些类型参数是不同的。例如:

      abstract class OuterClass[T] {
        val x: T
      }
      
      val a = new OuterClass[Int] { val x = 5 }
      val b = new OuterClass[String] { val x = "abc" }
      

      所以这就是难题... InnerTrait 必须与OuterClass 的实例相关联,因为每个实例可能有不同的类型参数。但是,您想将InnerTrait 作为参数传递给OuterClass 构造函数,因此您需要在OuterClass 之前构造InnerTrait。但是由于InnerTrait 必须绑定到OuterClass 的实例,所以OuterClass 必须在InnerClass 之前构造,这就变成了鸡与蛋的问题。

      这个设计有点奇怪,所以我建议你重新考虑一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        • 2015-07-03
        相关资源
        最近更新 更多