在Java中我有这两个类:
public class Base {
protected Long id;
// getter setter
}
public User extends Base {
private String name;
private Integer age;
public User(Long id) { this.id = id; }
// getter setter
}
我在Kotlin中创建了这两个类:
open class Base(var id: Long? = null)
class User(
var id: Long? = null,
var name: String? = null,
var age: Int? = null
) : Base()
现在在Java中我想只使用'id'参数调用User()构造函数:
new User(5);
这对我来说似乎不对,因为通过这样做我在User类中重新声明了“id”字段。
如何在Kotlin中设置基类的id字段(就像我用Java做的那样“this.id = id;”?
答案 0 :(得分:7)
首先,您的Kotlin代码无法编译,因为您会收到以下错误:Error:'id' hides member of supertype 'Base' and needs 'override' modifier
。
基本上,编译器还会抱怨您在id
中从Base
重新声明了User
。
如果您想重新声明它,则需要先在id
中Base
open,然后在User
中,您需要使用override重新声明id
时的关键字。 (另见this)
此外,要使Kotlin编译器生成User
构造函数的重载,您需要使用@JvmOverloads注释主构造函数。如果没有@JvmOverloads,您将无法在Java中使用User(id)
构造函数(仅id
作为参数),并且必须指定所有3个参数。
所以你的代码会变成:
open class Base(open var id: Long? = null)
class User @JvmOverloads constructor(override var id: Long? = null,
var name: String? = null,
var age: Int? = null
) : Base(id)
现在,如果您不想在用户中重新声明id
,则不能在其前面使用var
,而是直接将其传递给Base
,在调用它的构造函数时。基本上就是这样:
open class Base(var id: Long? = null)
class User @JvmOverloads constructor(id: Long? = null,
var name: String? = null,
var age: Int? = null
) : Base(id)
答案 1 :(得分:-1)
我认为这只是将ID传递给超类的构造函数
open class Base(var id: Long? = null)
class User(
var id: Long? = null,
var name: String? = null,
var age: Int? = null
) : Base(id)