在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;”所做的那样?
最佳答案
首先,您的 Kotlin 代码将无法编译,因为您会收到以下错误:错误:'id' 隐藏父类(super class)型 'Base' 的成员并需要 'override' 修饰符
。
基本上,编译器还会提示您在 User
中从 Base
重新声明了 id
。
如果要重新声明,需要先将id
open在 Base
中,然后在 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)
现在,如果您不想在 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)
关于java - Kotlin 中的简单继承示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49811511/