我认为我的标题不会再令人困惑了。我正在将 Kotlin 集成到现有的 Java 项目中。我有一个 Java 类,基本上是这样定义的:
class EntityBase {
private Long id;
public EntityBase() { }
public EntityBase(Long id) { this.id = id; }
}
然后,我定义了一个像这样的 Kotlin 数据类,并尝试使用配套方法从 DTO 中水合该对象,但我无法从该方法通过对象创建:
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
等只会使用 data
类的构造函数中的值生成。如果您使用上述方法在对象上调用 toString
,您将看到它仅使用 name
和 desc
。
关于java - 来自 Java 父类(super class)构造函数访问的 Kotlin 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50067945/