首页 > 解决方案 > 为具有泛型的类创建 Espresso Matcher

问题描述

我正在尝试为浓缩咖啡创建一个新的匹配器,以便能够选择一个列表项。这适用于像 Office 这样的简单类。请参阅此示例。

  private fun withOffice(title: String): Matcher<Any> {
    return object : BoundedMatcher<Any, Office>(Office::class.java) {
        override fun describeTo(description: Description?) {
            description?.appendText("with title '$title'");
        }

        public override fun matchesSafely(office: Office): Boolean {
            return office.name == title
        }
    }
}

然而,当引入泛型时,事情变得更加困难,就像在这个类中一样。

class KeyTranslationPair<F, S> extends Pair<F, S>

试图创建一个这样的匹配器

  private fun withCompanyType(companyType: CompanyType): Matcher<Any> {
    return object : BoundedMatcher<Any, KeyTranslationPair<CompanyType, String>>(KeyTranslationPair<CompanyType, String>::class.java) {
        override fun describeTo(description: Description?) {
            description?.appendText("with companyType '$companyType'");
        }

        public override fun matchesSafely(keyTranslationPair: KeyTranslationPair<CompanyType, String>): Boolean {
            return keyTranslationPair.key == companyType
        }
    }
}

导致以下错误

在此处输入图像描述

我的假设是 kotlin 将事情与 java 类型系统混为一谈。也许有人在这里有一个想法。

标签: androidgenericskotlinandroid-espresso

解决方案


那是因为KeyTranslationPair<CompanyType,Strnig>不是一个类,什么时候说类意味着KeyTranslationPair::class.java,所以,你可以这样做:

return object : BoundedMatcher<Any, KeyTranslationPair<*,*>>(KeyTranslationPair::class.java)

你是说你不知道里面是什么KeyTranslationPair,因为它是 aGeneric你必须将其更改matchesSafely为:

override fun matchesSafely(item: KeyTranslationPair<*, *>?): Boolean {
   return item?.key == companyType
}

您还可以检查是否KeyCompanyType做的一个实例:

override fun matchesSafely(item: KeyTranslationPair<*, *>?): Boolean {
    if(item?.key is CompanyType){
        return item.key == companyType
    }
        return false
    }

希望能帮助到你。


推荐阅读