Java Kotlin中的简单继承示例
在Java中,我有两个类: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
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是否提取而不是打开
?