在kotlin中正常类和数据类之间有什么区别?
我试图在任务6(DataClass)解决Kotlin Koan 。 当我在代码中使用正常的类时,测试用例变成失败。
这是我的数据类的代码:
data class Person(val name: String, val age: Int) fun task6(): List<Person> { return listOf(Person("Alice", 29), Person("Bob", 31)) }
这是数据类的结果:
[Person(name=Alice, age=29), Person(name=Bob, age=31)]
这是我的普通类的代码:
class Person(val name: String, val age: Int) fun task6(): List<Person> { return listOf(Person("Alice", 29), Person("Bob", 31)) }
这是普通班级的成绩:
[i_introduction._6_Data_Classes.Person@4f47d241, i_introduction._6_Data_Classes.Person@4c3e4790]
这意味着在kotlin中正常的类和数据类之间是有区别的。 那是什么?
更新 :
感谢@Mallow,你是对的。 那工作:
class Person(val name: String, val age: Int) { override fun toString(): String { return "Person(name=$name, age=$age)" } } fun task6(): List<Person> { return listOf(Person("Alice", 29), Person("Bob", 31)) }
为一个数据类。
编译器会自动从主构造函数中声明的所有属性中派生下列成员:
equals()/ hashCode()对,
toString()形式为“User(name = John,age = 42)”,
componentN()函数对应于它们的声明顺序的属性,
copy()函数(见下文)。
大多数时候,我们的开发人员使用类只保留类中的数据,而其他的东西(如几个默认的方法和一些其他的实现)也占用内存空间,这只是浪费资源。
从官方文档:
我们经常创建一个班级,除了保存数据外什么也不做。 在这样的类中,一些标准的功能通常是从数据中机械地导出的。 在Kotlin中,这被称为数据类,并被标记为
data
。编译器会自动从主构造函数中声明的所有属性中派生下列成员:
- equals()/ hashCode()对,
- toString()形式为“User(name = John,age = 42)”,
- componentN()函数对应于它们的声明顺序的属性,
- copy()函数(见下文)。 如果这些函数中的任何一个在类体中显式定义或者从基类继承,它将不会被生成。
要阅读更多信息,请检查数据类
关于结果, 从技术上说 ,由于toString()
方法的实现,你所得到的是不同的。 数据类“的toString()
方法使用数据类的属性和值来形成返回的字符串。 通用类的toString()
方法使用哈希码来形成返回的字符串。