在Kotlin的Pair数据类中,它有2个值:
Pair<out A, out B>
,这些值通过first
和second
命名的属性作为目标:
Pair(first: A, second: B)
但是,如果不存在第一个属性和属性,那么这些属性如何定位(例如,对于具有两个参数OtherClass<Int, Int>
的其他类?-是否有另一种定位它们的方法?)
PS:为什么Pair
是数据类而不是常规类?
答案 0 :(得分:3)
A和B是 not 属性,它们是类型参数。然后使用类型参数定义属性。
这是配对的source code:
public data class Pair<out A, out B>(
public val first: A,
public val second: B
) : Serializable {
/**
* Returns string representation of the [Pair] including its [first] and [second] values.
*/
public override fun toString(): String = "($first, $second)"
}
您定位属性(first
和second
),而不是类型参数。
例如,假设您有Pair<Int, String>
。这意味着A
是Int
,B
是String
。
first
是类型A
的属性,second
是类型B
的属性,因此first
是Int
和{ {1}}是second
。
为回答您的“ PS”,Pair是一个数据类,因为它授予了usual benefits,例如生成的equals()方法。
答案 1 :(得分:1)
Pair
表示两个值的通用对,将其视为中间带有分隔符的框。不管您在分隔线的两边放什么。
什么是第一和第二:
如果您查看Robs Answer,则会看到Pair类具有两个公共值,一个是 名称为“ first”,另一个名称为“ second”。它基本上意味着每个盒子(对) 有两面,它不在乎您在两面都放什么,默认情况下,我已命名 如果您想从左侧获取某些内容,则一侧为“第一”,另一侧为“第二” 首先将其引用,如果您想要右侧的内容,则将其引用。
做Pair("Some Words", 99)
只是意味着您想要一个盒子,一侧容纳一个字符串,另一侧容纳一个整数。
执行myPair = Pair("value 1", 100)
只是意味着您想要一个盒子,其中一侧容纳一个字符串(值1),另一侧容纳一个整数(100),并且您将此盒子命名为myPair。
由于Kotlin不在乎您要放入盒子中的东西的类型,因此完全可以为myPair=Pair(null, 99)
之类的对添加空值,这是检查是否存在空值的工作。从该对中添加或提取空值。
检索值:
假设您执行类似var myPair = Pair("value 1", 100)
的操作
如果要查看myPair中的内容,可以执行以下操作:
println(myPair.first) -> "value 1"
println(myPair.second) -> 100
为什么配对数据类而不是常规类?
数据类的主要目的是保存数据。 数据类有一些限制,因此编译器可以向所有数据类添加一些标准功能,例如eaquls(),hashCode()
Pair类用于保存一对数据,因此可以受益于某些标准功能,例如toString()。
您可以阅读详细信息HERE
答案 2 :(得分:0)
如果看一下Pair
的实现方式,您会发现它是一个简单的数据类,具有两个属性:first
和second
。
public data class Pair<out A, out B>(
public val first: A,
public val second: B
)
因此,您显然可以使用以下语法访问这些属性:pair.first
和pair.second
。名字first和second不是特殊的关键字,只是属性名称。
请注意,一般而言,对和数据类有一些特殊之处,可以在此处观察到:
val p = Pair(1, 2)
val (f: Int, s: Int) = p
println(f) //1
println(s) //2
此技术称为destructuring,并且可以通过componentX
运算符来实现,如果使用data
类,这些运算符将自动为您生成。