Java Kotlin中的简单继承示例

Java Kotlin中的简单继承示例,java,kotlin,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 cla

在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);
这对我来说似乎是错误的,因为通过这样做,我在用户类中重新声明了“id”字段


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

我相信这只是将id传递给超类的构造函数的问题

open class Base(var id: Long? = null)
class User(
    var id: Long? = null,
    var name: String? = null,
    var age: Int? = null
) : Base(id)

首先,Kotlin代码将无法编译,因为会出现以下错误:
错误:'id'隐藏超类型'Base'的成员,并需要'override'修饰符

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

如果要重新声明,首先需要在
Base
中设置
id
,然后在
User
中,在重新声明
id
时需要使用关键字(另请参见)

此外,为了让Kotlin编译器生成
用户
构造函数的重载,您需要使用@JvmOverloads注释主构造函数。如果没有@JvmOverloads,您将无法在Java中使用
用户(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)
现在,如果您不想在User中重新声明
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)

请编辑第一个代码段,使
User extends Base
完成。我没有复制粘贴代码,忘记添加它。不会编译。错误是:
'id'隐藏超类型'Base'的成员,需要'override'修饰符
。这应该教会我在临时文件中测试我的代码段。感谢您的解释,我刚刚省略了@JVMLowloads查看发生了什么,并得到了编译时错误。对于注释,一切都按预期进行。感谢您的详细解释!非常高兴。@JVM重载只允许您在Java中使用
User(id)
构造函数,而不是
User(id、name、age)
。@JVMLowloads的一个恼人之处是,虽然Kotlin接口中的方法可以有默认参数,但您不能在Kotlin接口中使用它。当从Java使用接口时,这可能会产生意外,但通过在接口本身中重载方法很容易修复。为什么我们不能将成员声明为
ab是否提取而不是打开