【问题标题】:Scala Internal Class Typing - Type Mismatch ErrorScala 内部类键入 - 类型不匹配错误
【发布时间】:2019-10-28 05:41:03
【问题描述】:

我在运行以下代码时遇到了一个非常奇怪的输入错误。

此代码的目标是拥有一个可以将此类的其他实例与其自身组合的类,从而生成更新后的实例。 (也许我应该更喜欢不变性和返回副本,但这是另一个讨论)。

在我尝试运行代码之前,IntelliJ 不会抱怨,然后它会因

而崩溃

发现类型不匹配:mic.MyInternalClass 必需:MyClass.this.MyInternalClass this.myVar =
this.myVar.combine(mic.myVar)"

IntelliJ Error Message

class MyClass(s: String) {

  var myVar: MyInternalClass = new MyInternalClass(s)

  def combine(mic: MyClass): MyClass = {

    this.myVar = this.myVar.combine(mic.myVar)
    this
  }

  class MyInternalClass(s: String) {

    var myInternalVar: String = s

    def combine(mic: MyInternalClass): MyInternalClass = {
      this.myInternalVar += mic.myInternalVar
      this
    }
  }
}


object App {


  def main(args : Array[String]) {

    var mc1: MyClass = new MyClass("dog")
    var mc2: MyClass = new MyClass("cat")

    mc1.combine(mc2)

    println(mc1.myVar.myInternalVar)
    println(mc2.myVar.myInternalVar)
  }

}

【问题讨论】:

    标签: scala


    【解决方案1】:

    每个实例的 MyInternalClass 在 Scala 中被视为一个单独的类型,因此您不能混合使用 thismicMyInternalClass。如果这不是您想要的,那么最好将 MyInternalClass 声明移动到伴随对象,而不是在任何地方使用 MyClass#MyInternalClass

    // otherwise you'll need to write MyClass.MyInternalClass explicitly even inside MyClass
    import MyClass.MyInternalClass
    
    class MyClass(s: String) {
    
      var myVar: MyInternalClass = new MyInternalClass(s)
    
      def combine(mic: MyClass): MyClass = {
    
        this.myVar = this.myVar.combine(mic.myVar)
        this
      }
    }
    
    object MyClass {
      class MyInternalClass(s: String) {
    
        var myInternalVar: String = s
    
        def combine(mic: MyInternalClass): MyInternalClass = {
          this.myInternalVar += mic.myInternalVar
          this
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      我刚刚找到这个链接:Referring to the type of an inner class in Scala

      看起来内部类方法需要像这样的特殊类型:

      def combine(mic: MyClass#MyInternalClass): MyInternalClass = {
      

      仍在了解为什么会这样的细微差别。

      【讨论】:

        猜你喜欢
        • 2012-02-16
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多