2

为什么这不编译?

class test
{
  constructor() {
      var a = Date().day
      this(a)
  }

  constructor(a:Int) {
  }
}

错误是:“test”类型的表达式“this”不能作为函数调用。未找到函数“invoke()”。

建议的解决方法是添加以下内容:

private operator fun invoke(i: Int) {}

为什么?

4

3 回答 3

6

首先,这两个构造函数都是辅助构造函数。主构造函数是位于类主体之外的构造函数。

其次,如文档中所述,调用另一个构造函数的正确语法如下:

class Test {
    constructor() : this(1) { }

    constructor(a: Int) { }
}
于 2018-08-02T15:43:58.677 回答
1
class test constructor(){ // primary constructor (The primary constructor is part of the class header: it goes after the class name (and optional type parameters))

    constructor(a: Int) : this() { // secondary constructor

    }
}

如果你的类有定义primary constructorsecondary constructor需要委托给primary constructor. 见这里

我认为primary constructor 不能secondary constructor.

你可以这样想:次要调用主要和主要调用次要=>无限循环=>不可能

在你的情况下,有 2 secondary constructor,所以你可以这样做

class test {

    constructor() : this(Date().day) // I see it quite like Java here https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-to-be-the-first-statement-in-a-constructor

    constructor(a: Int) {
    }
}
于 2018-08-03T02:27:18.527 回答
-2

这里有几件事是错误的:

  • 类应始终使用驼峰式命名(test-> Test
  • 您不能像尝试那样调用另一个构造函数(this(1)在其他构造函数体内调用)

我认为你真正想要的是a一个属性,或者用默认值初始化它。你可以这样做

class Test(val a: Int) {
    constructor() : this(1) // notice how you can omit an empty body
}

甚至更好,像这样:

class Test(val a: Int = 1) // again an empty body can be omitted.

编辑:

如果您需要进行一些计算,请按照 Yole 回答下方的评论中的要求:

class Test(val day: Int) {
    // you can use any expression for initialization
    constructor(millis: Long) : this(Date(millis).day) 
}

或者如果事情变得更复杂:

class Test(var day: Int) {
    // pass something (i.e. 1) to the primary constructor and set it properly in the body
    constructor(millis: Long) : this(1) { 
        // some code
        day = // initialize day
    }
}
于 2018-08-02T15:52:10.317 回答