首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当T是"Any“类型时,泛型参数要求输入"Nothing”

当T是"Any“类型时,泛型参数要求输入"Nothing”
EN

Stack Overflow用户
提问于 2022-02-17 18:00:05
回答 1查看 761关注 0票数 1

我是一个新的Kotlin程序员,我遇到了一个有关泛型的问题。

在下面的代码中,我收到了一个与it.get(this)“类型不匹配”有关的错误。所需:无。找到:任意。

代码语言:javascript
运行
复制
inline fun <reified T : Any> Any.getPropertiesWithType() =
    this::class.memberProperties
        .filter { it.returnType.isSubtypeOf(T::class.starProjectedType) }
        .map {
            it.isAccessible = true
            it.get(this) as T
        }

这是令人困惑的,因为memberProperties返回一个Collection<KProperty1<T, *>>,其中T是this的类型,在我的例子中是AnyKProperty1.get()有一个相同类型的参数T,所以我希望Any可以在没有问题的情况下被传递。

我注意到的一件事是,过滤器和map中的it都是KProperty<out Any, *>>类型,但是memberProperties没有输出方差。

如果我将this::class替换为this.javaClass.kotlin,它可以正常工作,但这似乎是一种非常糟糕的方法。

如果有人知道解决这个问题的方法,或者一个完全不同的策略,我们将不胜感激。我对Kotlin很陌生,有时还是用Java的方式做事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 18:23:26

this::class类似于Java中的this.getClass(),后者返回KClass<out Any> (Java中的Class<? extends Object>)。毕竟,仅仅因为this的类型是Any,它的运行时类型可能不是Any --它可以是Any的任何子类。out Any抓住了这个想法。

因此,memberProperties of this::class将是KProperty1<out Any, *>的集合。

同样,您不能使用MutableList<out Any>add添加任何内容,也不能get KProperty1<out Any, *>的值--输入参数的类型被标记为out。考虑这一点的另一种方法是,该属性可能位于Any的任何子类上,试图使用this (它只是一个Any )获取属性,显然不起作用。

我会将未检查的强制转换移到it

代码语言:javascript
运行
复制
(it as KProperty1<Any, T>).get(this)

至于为什么.javaClass工作,这是因为javaClass实际上给了您一个Class<Any>,而不是Class<out Any>。海事组织,这没什么意义,但事实就是如此。

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

https://stackoverflow.com/questions/71163184

复制
相关文章

相似问题

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