我有以下用Java编写的接口方法定义:
<T extends View & ISpecificView> T getSpecificView();基于Java的使用者代码只需调用该方法并将返回的值作为对象处理,扩展View类并以下列方式实现ISpecificView接口,就可以对该方法进行操作:
getContainer().getSpecificView().whateverTclassMethod()为了调用Kotlin中的相同代码,我在getSpecificView()方法上得到了getSpecificView()错误。我希望显式地提供类型,但是我无法传递任何特定的类,因为实现ISpecificView接口的可能是ISpecificView类的任何祖先。传递单个View或ISpecificView都无济于事--它会导致Type argument is not within its bounds. Expected: View! Found ICustomView,反之亦然。
在调用方法时,是否有可能在Kotlin中传递与Java的T extends View & ISpecificView相当的值,这样我就可以使用它了吗?
发布于 2019-04-01 22:21:52
回顾一下(我希望我的问题是对的!),在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()需要对View或ISpecificView进行特定的强制转换,因为如果您只是这样做
getContainer().getSpecificView<KView>()你会得到
class your.package$ExtendingClass cannot be cast to class your.package.KView但那是很好的。
即使在Java中,您也需要决定是需要View还是ISpecificView。
这样,您就可以对View或ISpecificView的所有方法进行操作。
真的,我不知道还能尝试什么。希望有人能想出更好的办法。
编辑:如果你指的是Java语言,你可以
final ExtendedView ev = getContainer().getSpecificView();嗯,这是有点错误的imho,即使它编译,因为您不能保证返回类型是真正的ExtendedView。您可以肯定地知道,它扩展了View并实现了ISpecificView。
发布于 2019-04-01 22:20:49
https://stackoverflow.com/questions/55463812
复制相似问题