猿问

在 Kotlin 中调用具有泛型类型的方法,并具有多个参数类型约束

我用Java编写了以下接口方法定义:

<T extends View & ISpecificView> T getSpecificView();

基于 Java 的使用者代码只需调用此方法即可对此方法进行操作,并将返回的值视为扩展类并按以下方式实现接口的对象:ViewISpecificView

getContainer().getSpecificView().whateverTclassMethod()

尝试在 Kotlin 中调用相同的代码,我在方法上得到错误。我很想显式提供该类型,但我无法传递任何特定的类,因为它可能是实现接口的类的任何祖先。通过单一或无济于事 - 它会导致,反之亦然。Type inference failed: Not enough information to infer parameter T (...) Please specify it explicitlygetSpecificView()ViewISpecificViewViewISpecificViewType argument is not within its bounds. Expected: View! Found ICustomView

在调用方法时,是否有可能传递与Kotlin中的Java等效的Java,以便我可以使用它?T extends View & ISpecificView


阿晨1998
浏览 265回答 2
2回答

holdtom

回顾一下(我希望我答对了这个问题!),在Java中你可以做到final View view = getContainer().getSpecificView();&nbsp; // orfinal ISpecificView iview = getContainer().getSpecificView();在科特林,同样的事情val view: View = getContainer().getSpecificView()结果Type inference failed: Not enough information to infer parameter T经过50分钟的尝试和尝试...只是创建一个假人(摘要?classabstract class KView : View(), ISpecificView并使用它来显式设置泛型返回类型val view: View = getContainer().getSpecificView<KView>()view.whateverClassMethod()val iview: ISpecificView = getContainer().getSpecificView<KView>()iview.whateverInterfaceMethod()// or just(getContainer().getSpecificView<KView>() as View).whateverClassMethod()(getContainer().getSpecificView<KView>() as ISpecificView).whateverInterfaceMethod()需要对 or 进行特定强制转换,因为如果您只是这样做ViewISpecificViewgetContainer().getSpecificView<KView>()你会得到class your.package$ExtendingClass cannot be cast to class your.package.KView但这完全没问题。即使在Java中,您也需要决定是想要一个还是一个.ViewISpecificView这样,您就可以对 或 的所有方法进行操作。ViewISpecificView真的,我不知道还能尝试什么。希望有人想出更好的东西。编辑:如果你的意思是在Java中,你做final ExtendedView ev = getContainer().getSpecificView();好吧,恕我直言,这有点错误,即使它编译了,因为您不能保证返回类型是真的 。您只是确定它扩展和实现。ExtendedViewViewISpecificView

蛊毒传说

您应该能够使用以下方法实现此目的:fun&nbsp;<T>&nbsp;getSpecificView()&nbsp;where&nbsp;T&nbsp;:&nbsp;View,&nbsp;T&nbsp;:&nbsp;ISSpecificView&nbsp;{}可在此处找到相关文档。
随时随地看视频慕课网APP

相关分类

Java
我要回答