无法使用解构声明

时间:2018-01-16 18:31:25

标签: kotlin

我有一个班级Person

class Person(val name: String, val age: Int)

我想使用Parent这样的解构声明:

val (name, age) = Person("name", 22)

但是我收到了这个错误:

  

Person类型的解构声明初始化程序必须具有   ' COMPONENT1()'函数解构声明初始化器的类型   人必须拥有' component2()'功能

3 个答案:

答案 0 :(得分:11)

我们需要将Person声明为数据类。

data class Person(val name: String, val age: Int)

在文档中并不是很清楚,但官方参考:

https://kotlinlang.org/docs/reference/multi-declarations.html#example-returning-two-values-from-a-function

来自Marko Topolnik评论:
如果由于某种原因某人不能使用数据类,那么它不是强制性的。您可以在任何类中声明函数component1()component2()

答案 1 :(得分:2)

如果您只是让IDE为您做一些工作,这将非常有用。以下是IntelliJ IDEA提供的有助于解决错误的建议:

enter image description here

它基本上列出了所有替代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