为什么这不编译?
class test
{
constructor() {
var a = Date().day
this(a)
}
constructor(a:Int) {
}
}
错误是:“test”类型的表达式“this”不能作为函数调用。未找到函数“invoke()”。
建议的解决方法是添加以下内容:
private operator fun invoke(i: Int) {}
为什么?
为什么这不编译?
class test
{
constructor() {
var a = Date().day
this(a)
}
constructor(a:Int) {
}
}
错误是:“test”类型的表达式“this”不能作为函数调用。未找到函数“invoke()”。
建议的解决方法是添加以下内容:
private operator fun invoke(i: Int) {}
为什么?
首先,这两个构造函数都是辅助构造函数。主构造函数是位于类主体之外的构造函数。
其次,如文档中所述,调用另一个构造函数的正确语法如下:
class Test {
constructor() : this(1) { }
constructor(a: Int) { }
}
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 constructor
,secondary 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) {
}
}
这里有几件事是错误的:
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
}
}