首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在具有多参数类型约束的Kotlin中调用具有泛型类型的方法

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

Stack Overflow用户
提问于 2019-04-01 21:26:42
回答 2查看 1.8K关注 0票数 5

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

代码语言:javascript
复制
<T extends View & ISpecificView> T getSpecificView();

基于Java的使用者代码只需调用该方法并将返回的值作为对象处理,扩展View类并以下列方式实现ISpecificView接口,就可以对该方法进行操作:

代码语言:javascript
复制
getContainer().getSpecificView().whateverTclassMethod()

为了调用Kotlin中的相同代码,我在getSpecificView()方法上得到了getSpecificView()错误。我希望显式地提供类型,但是我无法传递任何特定的类,因为实现ISpecificView接口的可能是ISpecificView类的任何祖先。传递单个ViewISpecificView都无济于事--它会导致Type argument is not within its bounds. Expected: View! Found ICustomView,反之亦然。

在调用方法时,是否有可能在Kotlin中传递与Java的T extends View & ISpecificView相当的值,这样我就可以使用它了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-01 22:21:52

回顾一下(我希望我的问题是对的!),在Java中您可以这样做!

代码语言:javascript
复制
final View view = getContainer().getSpecificView();  // or
final ISpecificView iview = getContainer().getSpecificView();

在科特林,同样的事情

代码语言:javascript
复制
val view: View = getContainer().getSpecificView()

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

经过50分钟的尝试.

只需创建一个虚拟class (抽象?)

代码语言:javascript
复制
abstract class KView : View(), ISpecificView

并使用它显式设置泛型返回类型。

代码语言:javascript
复制
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()

需要对ViewISpecificView进行特定的强制转换,因为如果您只是这样做

代码语言:javascript
复制
getContainer().getSpecificView<KView>()

你会得到

代码语言:javascript
复制
class your.package$ExtendingClass cannot be cast to class your.package.KView

但那是很好的。

即使在Java中,您也需要决定是需要View还是ISpecificView

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

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

编辑:如果你指的是Java语言,你可以

代码语言:javascript
复制
final ExtendedView ev = getContainer().getSpecificView();

嗯,这是有点错误的imho,即使它编译,因为您不能保证返回类型是真正的ExtendedView。您可以肯定地知道,它扩展了View并实现了ISpecificView

票数 6
EN

Stack Overflow用户

发布于 2019-04-01 22:20:49

您应该能够使用以下方法实现这一点:

代码语言:javascript
复制
fun <T> getSpecificView() where T : View, T : ISSpecificView {}

这方面的文档可以找到这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55463812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档