Kotlin中的简单继承示例

Wol*_*359 2 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
}
Run Code Online (Sandbox Code Playgroud)

我在Kotlin创建了这两个类:

open class Base(var id: Long? = null)
class User(
        var id: Long? = null,
        var name: String? = null,
        var age: Int? = null
) : Base()
Run Code Online (Sandbox Code Playgroud)

现在在Java中我想用只有'id'参数调用User()构造函数:

new User(5);
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎不对,因为通过这样做,我重新声明了User类中的"id"字段.

如何在Kotlin中设置基类的id字段(就像我用Java做的那样"this.id = id;"?

cju*_*jiu 7

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

基本上,编译器也会抱怨你id从中重新声明Base了User.

如果你想重新声明它,你需要先id 开的Base,然后User,你需要使用替代关键字,redeclarding时id.(也见这个)

此外,要使Kotlin编译器生成User构造函数的重载,您需要使用@JvmOverloads注释主构造函数.如果没有@JvmOverloads,您将无法在Java中使用User(id)构造函数(就像idparam一样),并且必须指定所有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)
Run Code Online (Sandbox Code Playgroud)

现在,如果你不想id在User中重新声明,你可以简单地不在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)
Run Code Online (Sandbox Code Playgroud)