You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:22:14