Kotlin Contracts

I have a question regarding Kotlin Contracts.


I have a sealed class that can be two types:

sealed class ApiResponse<out T> {

data class Success<out T>(val response: T) : ApiResponse<T>()

data class Error(

val code: Int? = null,

val message: String? = null,

val response: ErrorResponse? = null

) : ApiResponse<Nothing>()



Casting every time I need to read

response: T

is tedious.

val networkResponse = getResponse()

if(networkResponse is ApiResponse.Success<SomeType>) {}


Because of this I decided to use kotlin contract api and wrote function like this.


fun isSuccessful(): Boolean {

contract {

returns(true) implies (this@ApiResponse is Success<T>)


return this is Success<T>


Problem with this approach is that when I write

if (networkResponse.isSuccessful()) {

//here networkResponse.response is T not SomeType


Any ideas how can I fix it?

submitted by /u/RichAd1495
[link] [comments]