Внутренняя типизация Scala - ошибка несоответствия типов - PullRequest
0 голосов
/ 28 октября 2019

Я испытываю очень странную ошибку при вводе кода ниже.

Цель этого кода - создать класс, который может комбинировать другие экземпляры этого класса с самим собой, создавая обновленный экземпляр. (Возможно, я бы предпочел неизменность и возврат копий, но это другое обсуждение).

IntelliJ не жалуется, пока я не пытаюсь запустить код, затем он вылетает с

обнаружено несоответствие типов: mic.MyInternalClass требуется: MyClass.this.MyInternalClass this.myVar =
this.myVar.combine (mic.myVar) "

Сообщение об ошибке IntelliJ

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)
  }

}

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Каждый экземпляр MyInternalClass считается отдельным типом в Scala, поэтому вы не можете смешивать this и mic 'MyInternalClass. Если это не то, что вам нужно, вместо использования MyClass#MyInternalClass везде лучше переместить объявление 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
    }
  }
}
0 голосов
/ 28 октября 2019

Я только что нашел эту ссылку: Ссылаясь на тип внутреннего класса в Scala

Похоже, что метод внутреннего класса нуждается в специальном типе, например:

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

Все еще изучая нюансы, почему это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...