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)
}
}