gpt4 book ai didi

java - Kotlin 中的简单继承示例

转载 作者:行者123 更新时间:2023-12-02 05:33:28 25 4
gpt4 key购买 nike

在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 openBase 中,然后在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com