我有一个班级Person
:
class Person(val name: String, val age: Int)
我想使用Parent
这样的解构声明:
val (name, age) = Person("name", 22)
但是我收到了这个错误:
Person类型的解构声明初始化程序必须具有 ' COMPONENT1()'函数解构声明初始化器的类型 人必须拥有' component2()'功能
答案 0 :(得分:11)
我们需要将Person
声明为数据类。
data class Person(val name: String, val age: Int)
在文档中并不是很清楚,但官方参考:
来自Marko Topolnik评论:
如果由于某种原因某人不能使用数据类,那么它不是强制性的。您可以在任何类中声明函数component1()
和component2()
。
答案 1 :(得分:2)
如果您只是让IDE为您做一些工作,这将非常有用。以下是IntelliJ IDEA提供的有助于解决错误的建议:
它基本上列出了所有替代:data
类可能是最简单的。您也可以手动创建相应的componentX
函数,否则这些函数会自动为data
类生成。在这个SO thread中,我提供了一些关于这种功能的信息。
关于您的示例,我将展示如何使用扩展函数提供componentX
函数。每当您使用无法自行修改的类时,此方法特别有用。就这么简单:
private operator fun Person.component1() = name
private operator fun Person.component2() = age
答案 2 :(得分:0)
解决此问题的最简单方法是使用数据类,因为数据类会自动声明componentN()
函数(see the docs)。
data class Person(val name: String, val age: Int)
val (name, age) = Person("name", 22) // OK
有时您可能无法访问要允许进行销毁的类的源代码,因此,如果出于任何原因而不允许使用数据类,则可以提供componentX
函数({{1 }}和component1
)。使用扩展功能。
component2