【问题标题】:Kotlin value vs. reference in assignment [duplicate]Kotlin 值与分配中的引用 [重复]
【发布时间】:2018-09-10 03:34:08
【问题描述】:

我需要一个类引用另一个类。不创建它的副本,但实际引用已经存在的实例。

我也许可以用一个例子更好地解释它。我们有没有上课Image:

class Image(imgPath: String) {
    val height   : Int
    val width    : Int
    val rgbMatrix: MutableList< MutableList< Triple<Int, Int, Int> > >

    /* ... etc. ... */
}

现在说我想要一个类ImageManager,它只引用一个已经存在的Image

class ImageManager(val img: Image) {
   /* ... */
}

所以我可以有这种行为:

val image = Image("/res/images/image.png")

val imageManager = ImageManager(image)

// Setting the pixel at (125, 25) to black
imageManager.img.rgbMatrix[125, 25] = Triple(0, 0, 0)

// Should print the update value(0, 0, 0)
print( image.rgbMatrix[125, 25] )

我的问题是:

  1. 在 Kotlin 中,in assignment 何时分配引用,何时分配副本?

  2. 我如何确定什么时候发生的分配?

  3. 官方文档中有详细说明吗?如果有我找不到。

提前致谢!

【问题讨论】:

  • 你试过了吗?
  • @OliverCharlesworth 我没有,因为我的问题不是关于这个特殊情况。尝试 this 示例当然是微不足道的,但是在我正在努力达到需要此行为的状态和条件并对其进行充分测试的大型项目中将非常困难,所以我我正在寻找一个普遍的答案:)

标签: class oop object reference kotlin


【解决方案1】:

Similar to Java,Kotlin 不会在赋值时隐式复制对象。变量总是保存对对象的引用,将表达式分配给变量只会复制对对象的引用,而不是对象本身。

在底层,每个值要么是一个原始值(IntBooleanChar 等),要么是一个引用。赋值时,结果要么是原语的副本,要么是对同一对象的引用的副本,这永远不会导致被引用的对象被复制。

据我所知,这种行为没有明确记录;相反,假定它与 Java 中的相同。

另见:Is Kotlin “pass-by-value” or “pass-by-reference”?

【讨论】:

  • 谢谢!现在,有没有哪些类型是原始类型的列表,哪些不是?我的意思是在 java 中很明显,原始类型不是对象,你只需像在 C 中一样实例化它们,但是在这里,没有显式的原始类型......
  • 其实从类型系统和语言的角度来看,Kotlin 根本没有原始类型,它们大多是一个实现细节(参见 Q&A)。您可以查看 JVM 原语类型列表,了解哪些类型可以优化为 JVM 上的原语(这些是 numeric types,加上 CharBoolean)。
猜你喜欢
  • 2020-07-29
  • 2017-03-01
  • 2022-09-23
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多