Kotlin中的简单继承示例

时间:2018-04-13 07:25:05

标签: java kotlin

在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;”?

2 个答案:

答案 0 :(得分:7)

首先,您的Kotlin代码无法编译,因为您会收到以下错误:Error:'id' hides member of supertype 'Base' and needs 'override' modifier

基本上,编译器还会抱怨您在id中从Base重新声明了User

如果您想重新声明它,则需要先在idBase 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)