2 回答
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
添加回答
举报
