Marc Knaup
04/14/2021, 6:27 PMfun RequestInit(request: Request): RequestInit =
Object.assign(jsObject(), request)
Why does that work in Kotlin 1.4 but fails in 1.5.0-RC? Is that intentional?
[TYPE_MISMATCH] Type mismatch.
Required: RequestInit
Found: Request
turansky
04/15/2021, 12:07 AMPromise.then
contract fix require such behaviourbashor
04/15/2021, 1:35 PMassign
is defined?Marc Knaup
04/15/2021, 1:36 PMkotlin-extensions
library 1.0.1-pre.148-kotlin-1.4.30
fun <T : Any, R : T> assign(dest: R, vararg src: T?): R
bashor
04/15/2021, 1:57 PMfun <T : Any, R : T> myassign(dest: R, vararg src: T?): R = TODO()
fun <T : Any> myjsObject(): T = TODO()
fun RequestInit(request: Request): RequestInit = myassign(myjsObject(), request)
bashor
04/15/2021, 1:58 PMVictor Petukhov
04/15/2021, 2:26 PMclass Request
class RequestInit
fun <T : Any, R : T> myassign(dest: R, vararg src: T?): R = TODO()
fun <T : Any> myjsObject(): T = TODO()
fun RequestInit(request: Request): RequestInit = myassign(myjsObject(), request)
expected type (RequestInit
) isn’t actually subtype of Request
as should be by looking at declarations.
Also it can be exploited to go though type system hole and get runtime exception without any compile time errors:
class Request(var x: Int)
class RequestInit {
fun isRequestInit() {}
}
fun <T, R : T> myassign(dest: R, src: T): R = dest
inline fun <reified T : Request> myjsObject(): T = T::class.createInstance()
fun getRequestInit(request: Request): RequestInit = myassign(myjsObject(), request) // `myjsObject()` has `{Request & RequestInit}` type
fun main() {
getRequestInit(Request(1)).isRequestInit() // CCE: java.lang.Object cannot be cast to Request
}
So the change in the compiler is intended (it was really introduced recently), and source code’s fix is needed.Marc Knaup
04/15/2021, 2:27 PMassign
is incorrect? I don’t understand the reason for the R : T
constraint anyway.Victor Petukhov
04/15/2021, 2:33 PMR : T
or change use site – actual arguments by passing only arguments which satisfy to upper bound constraint.Marc Knaup
04/15/2021, 2:35 PMfun RequestInit(request: Request): RequestInit =
Object.assign(jsObject<RequestInit>(), request)
Marc Knaup
04/15/2021, 2:35 PMVictor Petukhov
04/15/2021, 2:39 PMMarc Knaup
04/15/2021, 2:40 PMbashor
04/15/2021, 3:10 PMfun <D, R : D> assign(dest: D, vararg src: Any?): R
bashor
04/15/2021, 3:11 PMturansky
04/15/2021, 3:39 PMdynamic
sources?
fun <D, R : D> assign(dest: D, vararg src: dynamic): R
Leonid Khachaturov
04/15/2021, 7:13 PM