为具有泛型的类创建一个Espresso Matcher

时间:2019-05-21 07:05:44

标签: android generics kotlin android-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
        }
    }
}

导致以下错误

enter image description here

我的假设是kotlin将事情与Java类型系统混合在一起。 也许有人在这里有个主意。

1 个答案:

答案 0 :(得分:1)

那是因为KeyTranslationPair<CompanyType,Strnig>不是一个类,当说类的意思是KeyTranslationPair::class.java时,您可以像这样:

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

您说的是您不知道KeyTranslationPair的内容,并且由于它是Generic,因此您必须将matchesSafely更改为:

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

您还可以检查Key是否是CompanyType的实例:

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

希望有帮助。