aballano
08/04/2017, 12:46 PMfun <T> Intent.getSerializableOrDefault(name: String, default: T) =
getSerializableExtra(name) as T ?: default
my guess is that being T a non-nullable type this should crash while trying to cast, right? But apparently in my test it works:
@Test fun `should get default`() {
val default = ASerializableClass(2)
assertThat(Intent().getSerializableOrDefault("a", default)).isEqualTo(default)
}
Slack Conversationdiesieben07
08/04/2017, 12:48 PMas T
is an unchecked cast, it does not actually do any check, it says "ok I'll assume this is a T now".aballano
08/04/2017, 12:48 PMnull as String
it will crashdiesieben07
08/04/2017, 12:49 PMString
is a concrete type. T
is a type parameter, it could be any type, it's erased.diesieben07
08/04/2017, 12:49 PMT
could be String?
, too.aballano
08/04/2017, 12:50 PMaballano
08/04/2017, 12:50 PMassertThat(Intent().getSerializableOrDefault<ASerializableClass>("a", default)).isEqualTo(default)
that still worksdiesieben07
08/04/2017, 12:50 PMgetSerializableOrDefault
the compiler does not know that.diesieben07
08/04/2017, 12:51 PMT
is, so you cannot check for it.aballano
08/04/2017, 12:54 PMdiesieben07
08/04/2017, 12:55 PMgetSerializableOrDefault
method looks like this:
fun Intent.getSerializableOrDefault(name: String, default: Any?)
diesieben07
08/04/2017, 12:55 PMas T
does nothing at runtime. There is no actual type-check performed.trevjones
08/04/2017, 12:55 PMT?
so that it is more clearaballano
08/04/2017, 12:55 PMdiesieben07
08/04/2017, 12:56 PMaballano
08/04/2017, 12:56 PMas? T
or as T?
, but Take is still rightaballano
08/04/2017, 12:56 PMtrevjones
08/04/2017, 1:05 PM