Kotlin自定义泛型类出现类型不匹配问题求助
问题原因与解决方案
先看你给出的两个对比场景:
正常运行的代码
fun foo(): List<String> { return ArrayList<String>().apply { this.add("1234") } }
这段代码能正常运行,是因为ArrayList<String>是List<String>的直接实现类,二者泛型参数完全一致,符合类型替换规则。
报错的代码
fun bar(): Matcher<String> { return MyJsonNullableMatcher() }
报错提示Type mismatch,核心原因出在自定义泛型类的继承关系上:
你的MyJsonNullableMatcher<T>定义如下:
import org.hamcrest.Matcher import org.hamcrest.TypeSafeDiagnosingMatcher class MyJsonNullableMatcher<T> : TypeSafeDiagnosingMatcher<JsonNullable<T>>() { override fun describeTo(desc: Description) { // 实现细节 } override fun matchesSafely(actual: JsonNullable<T>, mismatchDescription: Description): Boolean { // 实现细节 return true } }
由于TypeSafeDiagnosingMatcher<U>是Matcher<U>的子类,所以MyJsonNullableMatcher<T>实际上是Matcher<JsonNullable<T>>的子类,而非Matcher<T>的子类。
当你调用MyJsonNullableMatcher()时,编译器推断其类型为MyJsonNullableMatcher<String>,对应的父类型是Matcher<JsonNullable<String>>,但bar函数声明返回Matcher<String>,这两个类型无继承关系,因此出现类型不匹配错误。
解决办法
根据需求选择对应方案:
- 如果
MyJsonNullableMatcher就是用来匹配JsonNullable<T>类型的,修改bar函数的返回类型:fun bar(): Matcher<JsonNullable<String>> { return MyJsonNullableMatcher() } - 如果目标是让
MyJsonNullableMatcher能匹配T类型,修改类的继承泛型参数:class MyJsonNullableMatcher<T> : TypeSafeDiagnosingMatcher<T>() { // 重写方法时,参数类型对应改为T override fun matchesSafely(actual: T, mismatchDescription: Description): Boolean { // 实现逻辑 return true } override fun describeTo(desc: Description) { // 实现逻辑 } }
内容的提问来源于stack exchange,提问作者gstackoverflow
相关产品推荐
相关产品推荐

