AN
Size: a a a
AN
AM
IO
IO
AN
IO
AN
AN
AA
// компилируется
data class Foo1<out FOO>(val foo: FOO)
class Foo2<out FOO>(val foo: FOO) {
// не компилируется
// Type parameter FOO is declared as 'out'
// but occurs in 'in' position in type FOO
fun copy(_foo: FOO = foo): Foo2<FOO> = Foo2(_foo)
}
class Foo3<out FOO>(val foo: FOO)
// компилируется
fun <FOO> Foo3<FOO>.copy(_foo: FOO = foo): Foo3<FOO> = Foo3(_foo)
(
// компилируется
data class Foo1<out FOO>(val foo: FOO)
class Foo2<out FOO>(val foo: FOO) {
// не компилируется
// Type parameter FOO is declared as 'out'
// but occurs in 'in' position in type FOO
fun copy(_foo: FOO = foo): Foo2<FOO> = Foo2(_foo)
}
class Foo3<out FOO>(val foo: FOO)
// компилируется
fun <FOO> Foo3<FOO>.copy(_foo: FOO = foo): Foo3<FOO> = Foo3(_foo)
FOO
не тот же самый, что объявлен на уровне классаAA
FOO
не тот же самый, что объявлен на уровне классаAS
AA
copy
, так как создаётся новый объект.FOO
присутствует в in
позиции. Он потенциально может изменять ресивер, что не всегда корректно и может приводить к ошибкам приведения типов во время исполнения.AL
data class Test<out T>(val t: T)
fun main() {
val x = Test(5)
val y: Test<Any> = x
x.copy(t = 5)
// x.copy(t = "abc") // will not work
y.copy(t = "abc")
}
AA
data class Test<out T>(val t: T)
fun main() {
val x = Test(5)
val y: Test<Any> = x
x.copy(t = 5)
// x.copy(t = "abc") // will not work
y.copy(t = "abc")
}
G
G
AN
AN
G