首页 > 解决方案 > 接口中的类型参数是实际类型吗?

问题描述

不要认为标题是这个问题的最佳措辞,我有一个带有两个类型参数的接口,而且我似乎能够同时转换this为两种类型,请参阅可重现的示例:

interface BaseResult<S : BaseResult<S, E>, E : BaseResult<S, E>> {

    @Suppress("UNCHECKED_CAST")
    fun isSuccess(): Boolean {
        return try {
            val a = this as S //ClassCastException expected
            val b = this as E
            println(a) //com.BaseResultTest$ExampleResult$Error@17d10166
            println(b) //com.BaseResultTest$ExampleResult$Error@17d10166
            true
        } catch (e: Exception) {
            false
        }
    }
}

测试:

class BaseResultTest {

    sealed class ExampleResult: BaseResult<ExampleResult.Success, ExampleResult.Error> {
        object Success: ExampleResult()
        object Error: ExampleResult()
    }

    @Test
    fun test() {
        val error = ExampleResult.Error
        assertEquals(error.isSuccess(), false)
    }
}

我是否遗漏了什么,或者这是语言中的错误?使用 v1.3.61

标签: javagenericskotlin

解决方案


它是类型擦除,它对所有泛型都以相同的方式工作,而不仅仅是接口。在这种情况下,两个强制转换都等同于as BaseResult<*, *>.

Kotlin 有办法避免它,但仅限于inline方法的类型参数,而不是类或接口。


推荐阅读