为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

阿晨1998 2022-09-14 17:42:13
我用Java编写了以下接口方法定义:<T extends View & ISpecificView> T getSpecificView();基于 Java 的使用者代码只需调用此方法即可对此方法进行操作,并将返回的值视为扩展类并按以下方式实现接口的对象:ViewISpecificViewgetContainer().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
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

回顾一下(我希望我答对了这个问题!),在Java中你可以做到


final View view = getContainer().getSpecificView();  // or

final ISpecificView iview = getContainer().getSpecificView();

在科特林,同样的事情


val view: View = getContainer().getSpecificView()

结果Type inference failed: Not enough information to infer parameter T


经过50分钟的尝试和尝试...

只是创建一个假人(摘要?class


abstract 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 进行特定强制转换,因为如果您只是这样做ViewISpecificView


getContainer().getSpecificView<KView>()

你会得到


class your.package$ExtendingClass cannot be cast to class your.package.KView

但这完全没问题。

即使在Java中,您也需要决定是想要一个还是一个.ViewISpecificView


这样,您就可以对 或 的所有方法进行操作。ViewISpecificView


真的,我不知道还能尝试什么。希望有人想出更好的东西。


编辑:如果你的意思是在Java中,你做


final ExtendedView ev = getContainer().getSpecificView();

好吧,恕我直言,这有点错误,即使它编译了,因为您不能保证返回类型是真的 。您只是确定它扩展和实现。ExtendedViewViewISpecificView


查看完整回答
反对 回复 2022-09-14
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您应该能够使用以下方法实现此目的:

fun <T> getSpecificView() where T : View, T : ISSpecificView {}

在此处找到相关文档。


查看完整回答
反对 回复 2022-09-14
  • 2 回答
  • 0 关注
  • 263 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号