在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()函数(见下文)。

请参阅https://kotlinlang.org/docs/reference/data-classes.html

大多数时候,我们的开发人员使用类只保留类中的数据,而其他的东西(如几个默认的方法和一些其他的实现)也占用内存空间,这只是浪费资源。

从官方文档:

我们经常创建一个班级,除了保存数据外什么也不做。 在这样的类中,一些标准的功能通常是从数据中机械地导出的。 在Kotlin中,这被称为数据类,并被标记为data

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

  • equals()/ hashCode()对,
  • toString()形式为“User(name = John,age = 42)”,
  • componentN()函数对应于它们的声明顺序的属性,
  • copy()函数(见下文)。 如果这些函数中的任何一个在类体中显式定义或者从基类继承,它将不会被生成。

要阅读更多信息,请检查数据类

关于结果, 从技术上说 ,由于toString()方法的实现,你所得到的是不同的。 数据类“的toString()方法使用数据类的属性和值来形成返回的字符串。 通用类的toString()方法使用哈希码来形成返回的字符串。