What's the difference between:
fun <T, R> List<T>.map1(transform: (T) -> R): List<R> {
return this.map(transform)
}
and
fun <T, R> List<T>.map2(transform: (T?) -> R): List<R> {
return this.map(transform)
}
and
fun <T, R> List<T?>.map3(transform: (T?) -> R): List<R> {
return this.map(transform)
}
In my test, null
is accepted for all 3 transform functions above, so: Is there any difference between T
and T?
?
T. () -> Unit is an extension function type with receiver. Besides ordinary functions, Kotlin supports extension functions. Such function differs from an ordinary one in that it has a receiver type specification. Here it's a generic T.
When we define a collection with "*", it should contain the object of only that type. There should not be any mix and match between the data types inside a collection. If we use "Any", we can mix and match the data types, which means we can have multiple data types in a collection.
Using “it” keyword in place of a single parameter in Lambdas expressions. Learn about Lambdas Expressions and High-Level Functions. Kotlin as an Android Programming Language. Kotlin supports Functional programming where you can pass a function as a parameter and even return a function. Smartherd.
In Kotlin, the “this” keyword allows us to refer to the instance of a class whose function we happen to be running. Additionally, there are other ways in which “this” expressions come in handy.
In your examples, T
and T?
are equivalent, but there are other cases where the ?
does make a difference.
When you declare a type parameter <T>
, it doesn't have any restrictions on it. It's the same as writing <T: Any?>
, and it means T
will allow any sub-type of Any?
. Adding a ?
to it would make it nullable, but Any?
is already nullable, so the ?
doesn't change anything. That means that the set of types allowed by an unbounded type T
is the same as the set of types allowed by T?
.
As soon as you put restrictions on what T
can be, things change, though. For example, in the following function, we declare a type parameter <T: Any>
, restricting it so it's no longer nullable.
fun <T: Any> myFunction(item: T) // item can't be null
That means I can't pass null
to myFunction
. I can only call the function with a null
argument if I change the type of the parameter to be T?
.
fun <T: Any> myFunction(item: T?) // item can be null
Note that the ?
just annotates an existing type parameter. Declaring a type parameter with a ?
doesn't mean anything and doesn't compile. For example, fun <T?> myFunction(item: T)
isn't valid Kotlin code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With