Java 接口中的类型参数是实际类型吗?

Java 接口中的类型参数是实际类型吗?,java,generics,kotlin,Java,Generics,Kotlin,不要认为标题是这个问题的最佳措辞,我有一个带有两个类型参数的接口,而且我似乎能够将这个同时转换为两种类型,请参见可复制示例: interface BaseResult<S : BaseResult<S, E>, E : BaseResult<S, E>> { @Suppress("UNCHECKED_CAST") fun isSuccess(): Boolean { return try { val a

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

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
        }
    }
}
接口基本结果{
@抑制(“未选中的_CAST”)
fun issucess():布尔值{
回击{
val a=这是预期的S//ClassCastException
val b=这是E
println(a)//com.baseResultSet$ExampleResult$Error@17d10166
println(b)//com.baseResultSet$ExampleResult$Error@17d10166
符合事实的
}捕获(e:例外){
错误的
}
}
}
测试:

类BaseResultSet{
密封类ExampleResult:BaseResult{
对象成功:ExampleResult()
对象错误:ExampleResult()
}
@试验
趣味测试(){
val error=ExampleResult.error
assertEquals(错误。isSuccess(),false)
}
}
我是否遗漏了什么,或者这是语言中的错误?使用v1.3.61是的,它对所有泛型都是一样的,而不仅仅是对接口。在这种情况下,两个强制转换都相当于
作为BaseResult


Kotlin有,但仅用于
内联
方法的类型参数,而不是类或接口。

这不是语言中的一个错误,而是编写者的一个逻辑错误。虽然您可以改变
S
E
的类型,但它们仍然类似于
选项
,它是
部分
的子类型(一些总是键入
选项
,而
总是为空

这里的部分问题是,如果不明确声明这些情况下的子类型,就无法保证子类是
S
E
的类型。您可以在尝试中看到这方面的示例,以及其他一些示例


我希望这有助于回答这个问题。

为什么这个标签是java?
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)
    }
}