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 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/

相关文章:

java - HtmlUnit 获取页面错误

android - 如何使用 RxTextView (RxBinding) 检测 EditText 何时为空

java - 在 Java Android 应用程序中使用 Kotlin 代码

android - 如何在 Kotlin 中打开完全展开的 BottomSheetDialogFragment?

java - 如何登录GWT项目中的服务器部分

java - 错误 : AnnotationException: mappedBy reference an unknown target entity property

java - 在 JPA 中分离对象

java - 在不同的目录中使用 Java 的 exec 运行 .sh 文件?

collections - find 和 firstOrNull 有什么区别?

android - 有什么方法可以通过 kotlin-extensions 更改自动创建的 View 的名称?