Kotlin sealed class 和类型推断
Kotlin sealed class and type inference
我使用密封的 class 向客户端代码报告成功或错误:
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
但即使是最简单的单元测试也无法使用它进行编译:
val error = Result.Error(IOException("message"))
assertThat(error, instanceOf(Result.Error::class.java))
我收到消息:类型推断失败。没有足够的信息来推断 fun instanceOf(type : Class<*>) 中的参数 T : Matcher!
看来我在 Kotlin 中遗漏了一些重要的东西。
谢谢你帮我!
你的代码对我来说没有问题。
import org.hamcrest.CoreMatchers.instanceOf
import org.junit.Test
import org.junit.Assert.*
import java.io.IOException
class ExampleUnitTest {
@Test
fun test1() {
val error = Result.Error(IOException("message"))
assertTrue(error is Result.Error)
}
@Test
fun test2() {
val error = Result.Error(IOException("message"))
assertThat(error , instanceOf(Result.Error::class.java))
}
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
}
此外,我建议您使用关键字 is
来检查您的 class 是否是 kotlin 中的某个实例(例如在 test1 中)
看来我在看假的 API。因为我主要使用 assertj。
下面的代码清晰流畅阅读
assertThat(result).isInstanceOf(Result.Error::class.java)
为了避免::class我更喜欢这个。
assertThat(result is Result.Error).isTrue()
我使用密封的 class 向客户端代码报告成功或错误:
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
但即使是最简单的单元测试也无法使用它进行编译:
val error = Result.Error(IOException("message"))
assertThat(error, instanceOf(Result.Error::class.java))
我收到消息:类型推断失败。没有足够的信息来推断 fun instanceOf(type : Class<*>) 中的参数 T : Matcher!
看来我在 Kotlin 中遗漏了一些重要的东西。
谢谢你帮我!
你的代码对我来说没有问题。
import org.hamcrest.CoreMatchers.instanceOf
import org.junit.Test
import org.junit.Assert.*
import java.io.IOException
class ExampleUnitTest {
@Test
fun test1() {
val error = Result.Error(IOException("message"))
assertTrue(error is Result.Error)
}
@Test
fun test2() {
val error = Result.Error(IOException("message"))
assertThat(error , instanceOf(Result.Error::class.java))
}
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()
}
}
此外,我建议您使用关键字 is
来检查您的 class 是否是 kotlin 中的某个实例(例如在 test1 中)
看来我在看假的 API。因为我主要使用 assertj。 下面的代码清晰流畅阅读
assertThat(result).isInstanceOf(Result.Error::class.java)
为了避免::class我更喜欢这个。
assertThat(result is Result.Error).isTrue()