无法打印模型实例的值



我知道这是一个非常基本的问题,但回答这个问题将解决我的许多疑问。

val new_parent = ParentDetails(intent.extras.getString("name"), 
intent.extras.getString("email"),
intent.extras.getString("parent_relation"),
intent.extras.getString("locationdata"))
println(new_parent.tostring())

上面的代码不会打印类中存在的各种字段及其值。

ParentDetails是我使用一些初始化的字段创建的模型。ParentDetails模型:

class ParentDetails {
var parent_id: Int = 0
var parent_name: String = ""
var parent_email: String = ""
var parent_relation: String = ""
var parent_location: String=""
constructor(parent_name: String, parent_email: String, parent_relation: String,parent_location:String) {
this.parent_name = parent_name
this.parent_email = parent_email
this.parent_relation = parent_relation
this.parent_location = parent_location
}
public fun getparentId(): Int {
return parent_id
}
fun ParentDetailsprintme() {
println(parent_name)
println(parent_email)
println(parent_relation)
println(parent_location)
}
}

实际上,它打印null并访问单个字段,它打印空字符串(初始化方式(。

我们如何解释这一点?

据我了解,您的问题是调用println(new_parent.tostring())不会打印您想要在函数ParentDetailsprintme中打印的内容。

首先,您有一个错字,正确的调用是new_parent.toString().

请注意,它可以简化为println(new_parent).

它不会打印您在ParentDetailsprintme方法中定义的内容,因为不会调用该方法。

println(new_parent.toString())打印的内容实际上是对象的哈希代码,因为这是每个对象的默认行为。

要使其正常工作,请像println(new_parent.ParentDetailsprintme())一样调用它或覆盖toString()方法,例如:

override fun toString() = "$parent_name $parent_email $parent_relation $parent_location"

然后以下

val new_parent = ParentDetails("myName", "myEmail", "myParent_relation", "myLocationdata")
println(new_parent)

应该打印

myName myEmail myParent_relation myLocationdata

Kotlin 的println函数只是在引擎盖下调用System.out.println(message),这将调用String.valueOf()(例如String.valueOf(Object object)对象,这将调用所传递对象的toString()方法(。

/** Prints the given message and newline to the standard output stream. */
@kotlin.internal.InlineOnly
public inline fun println(message: CharArray) {
System.out.println(message)
}

更新("使用数据类方法也有效">(:

如果使类成为数据类:

data class ParentDetails(
val parent_id: Int = 0,
val parent_name: String = "",
val parent_email: String = "",
val parent_relation: String = "",
val parent_location: String = ""
)

然后你执行

val new_parent = ParentDetails(0, "myName", "myEmail", "myParent_relation", "myLocationdata")
println(new_parent)

您将收到结果

ParentDetails(parent_id=0, parent_name=myName, parent_email=myEmail, parent_relation=myParent_relation, parent_location=myLocationdata)

这是因为数据类覆盖了toString()函数:

编译器自动从所有成员中派生以下成员 在主构造函数中声明的属性:

  • 等于((/哈希代码(( 对;
  • toString(( 的形式为 "User(name=John, age=42(";

您是否检查过是否从intent.extras接收到有效数据?

另外,我建议您为模型使用data class。 它将看起来像这样:

data class ParentDetails(
var parent_id: Int = 0,
var parent_name: String = "",
var parent_email: String = "",
var parent_relation: String = "",
var parent_location: String = ""
)

您将能够像这样使用它:

val new_parent = ParentDetails(
parent_name = intent.extras.getString("name"),
parent_email = intent.extras.getString("email"),
parent_relation = intent.extras.getString("parent_relation"),
parent_location = intent.extras.getString("locationdata")
)
println(new_parent.tostring())

如前所述,您有一个错字。toString返回对象的哈希代码,除非它被重写以返回其他内容。查找原始实现以获取更多详细信息。

通过重写toString方法,您可以更改它返回的内容,并通过它更改print(someClass)时打印的内容。DVarga在他们的回答中表明了这一点。

数据类自动生成包含类内容的toString方法。因此,创建数据类是获取包含数据的输出的快捷方式。

您拥有的方法不起作用的原因是您没有调用它。 如果您调用它而不是toString,则会打印数据。

此外,打印类时会显式调用toString。你不需要打电话给print(someInstance.toString())print(someInstance)就足够了。


当我写一个答案时,你不需要在 Kotlin 中使用辅助构造函数。主构造函数将显著缩短代码,无论它是否是数据类。此外,您应该研究命名约定。

最新更新