首页 > 解决方案 > kotlin 接口、密封类和泛型类型使用(在接口函数中使用泛型类型的子类)

问题描述

我有这个密封类

sealed class S3FileUploaderRequest {
    abstract val s3Configuration: S3Configuration

    data class S3UploadRequest(
            val uploadData: S3UploadData,
            override val s3Configuration: S3Configuration
    ) : S3FileUploaderRequest()

    data class S3DeleteRequest(
            val path: String,
            override val s3Configuration: S3Configuration
    ) : S3FileUploaderRequest()

    data class S3MultiUploadRequest(
            val multiUploadData: List<S3UploadData>,
            override val s3Configuration: S3Configuration
    ) : S3FileUploaderRequest()

    data class S3MultiDeleteRequest(
            val paths: List<String>,
            override val s3Configuration: S3Configuration
    ) : S3FileUploaderRequest()
}

而这个界面:

interface FileUploader<T, S> {
    suspend fun multiUploadFile(request: T): S
    suspend fun multiDeleteFile(request: T): List<S>
    suspend fun uploadFile(request: T): S
    suspend fun deleteFile(request: T): S
}

我想使用接口函数的数据类 S3FileUploaderRequest es 入口参数的子类,如下所示:

interface FileUploader<T, S> {
        suspend fun multiUploadFile(request: out T): out S
        suspend fun multiDeleteFile(request: out T): List<S>
        suspend fun uploadFile(request: out T): out S
        suspend fun deleteFile(request: out T): out S
    }

有可能做到这一点吗?我觉得 kotlin 应该能够做到这一点,但没有找到合适的语法。

更新:

我想以这种方式实现接口:

    @Singleton
class S3FileUploader() : FileUploader<S3FileUploaderRequest, S3FileUploaderResponse> {

    override suspend fun uploadFile(request: S3UploadRequest): S3UploadResponse {
        //DO STUFF
    }

    override suspend fun deleteFile(request: S3DeleteRequest): S3DeleteResponse {
        //DO STUFF
    }

    override suspend fun multiUploadFile(request: S3MultiUploadRequest): S3MultiUploadResponse {
        //DO STUFF
    }

    override suspend fun multiDeleteFile(request: S3MultiDeleteRequest): List<S3DeleteResponse> {
        //DO STUFF
    }
}

标签: kotlingenericssyntax

解决方案


推荐阅读