来自Java超类构造函数访问的Kotlin构造函数
我不认为我的头衔会更让人困惑。我正在将Kotlin集成到现有的Java项目中。我有一个Java类,基本上是这样定义的:来自Java超类构造函数访问的Kotlin构造函数,java,kotlin,Java,Kotlin,我不认为我的头衔会更让人困惑。我正在将Kotlin集成到现有的Java项目中。我有一个Java类,基本上是这样定义的: class EntityBase { private Long id; public EntityBase() { } public EntityBase(Long id) { this.id = id; } } 然后,我定义了一个类似于这样的Kotlin数据类,并尝试使用一个伴随方法从DTO中水合该对象,但我无法通过对象创建从该方法访问EntityBas
class EntityBase {
private Long id;
public EntityBase() { }
public EntityBase(Long id) { this.id = id; }
}
然后,我定义了一个类似于这样的Kotlin数据类,并尝试使用一个伴随方法从DTO中水合该对象,但我无法通过对象创建从该方法访问EntityBase.id:
data class Thing(
val name: String,
val desc: String
) : EntityBase() {
companion object {
fun fromDto(dto: ThingDto) = Thing(
name = dto.name,
desc = dto.desc
id = dto.id // this doesn't work because id isn't part of Thing's constructor
)
}
我可以通过使用构造函数而不是伴随对象来解决这个问题,但我很好奇是否有一种我不知道的方法。Kotlin还是个新手。您需要将id添加到构造函数中,并在扩展时将其传递给基类构造函数
private data class Thing(
val name: String,
val desc: String,
val id: Long
) : EntityBase(id) {
companion object {
fun fromDto(dto: ThingDto) = Thing(
name = dto.name,
desc = dto.desc,
id = dto.id
)
}
}
这就是你所说的使用构造函数的意思吗?如果您不想使用构造函数,那么必须在基类中使用getter/setter注意:我不建议使用下面的示例-
class EntityBase {
private Long id;
public EntityBase() { }
public EntityBase(Long id) { this.id = id; }
public void setId(Long id) { this.id = id; }
public Long getId() { return id; }
}
然后你可以做-
private data class Thing(
val name: String,
val desc: String
) : EntityBase() {
companion object {
fun fromDto(dto: ThingDto) : Thing {
val thing = Thing(
name = dto.name,
desc = dto.desc)
thing.id = dto.id;
return thing;
}
}
}
然后,您没有链接构造函数,但这有一个很大的缺点-id不是数据类的一部分,toString、copy、equals等将仅使用数据类构造函数中的值生成。如果使用上述方法调用对象上的toString,您将看到它只使用name和desc。是的,就是这样。你的后一个例子是我试图让它工作,但我错过了你的前一个解决方案。谢谢