我正在尝试为特浓咖啡创建新的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类型系统混合在一起。 也许有人在这里有个主意。
答案 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
}
希望有帮助。