在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
}
Run Code Online (Sandbox Code Playgroud)
我在Kotlin创建了这两个类:
open class Base(var id: Long? = null)
class User(
var id: Long? = null,
var name: String? = null,
var age: Int? = null
) : Base()
Run Code Online (Sandbox Code Playgroud)
现在在Java中我想用只有'id'参数调用User()构造函数:
new User(5);
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎不对,因为通过这样做,我重新声明了User类中的"id"字段.
如何在Kotlin中设置基类的id字段(就像我用Java做的那样"this.id = id;"?
首先,您的Kotlin代码无法编译,因为您会收到以下错误:Error:'id' hides member of supertype 'Base' and needs 'override' modifier.
基本上,编译器也会抱怨你id从中重新声明Base了User.
如果你想重新声明它,你需要先id 开的Base,然后User,你需要使用替代关键字,redeclarding时id.(也见这个)
此外,要使Kotlin编译器生成User构造函数的重载,您需要使用@JvmOverloads注释主构造函数.如果没有@JvmOverloads,您将无法在Java中使用User(id)构造函数(就像idparam一样),并且必须指定所有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)
Run Code Online (Sandbox Code Playgroud)
现在,如果你不想id在User中重新声明,你可以简单地不在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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |