【问题标题】:Kotlin reflection + genericsKotlin 反射 + 泛型
【发布时间】:2017-02-07 17:29:01
【问题描述】:

编辑 1:更改标题,我的错。

我有一个界面事件

interface Event

还有一些实现它的类,比如CustomEvent

class CustomEvent : Event { ... }

我现在一直在尝试做的是:给定一个将事件作为参数的方法(因此,任何实现 Event 接口的类),就像这样

fun onCustomEvent(event: CustomEvent) {
    ...
}

,我想将该事件添加到列表中。因此,这个列表最终会包含一堆不同的事件。


Java 中,我相信它会是这样的(可能不是 100% 准确):

List<Class<? extends Event>> eventsList;

....

Class<?> param = methodThatHasSomeEventAsParam.parameterTypes[0];

if (Event.class.isAssignableFrom(param)) {
    Class<? extends Event> actualParam = (Class<? extends Event>) param;
    eventsList.add(actualParam); // Adds CustomEvent to the events list.
}

但至于 Kotlin,我真的不确定如何正确使用泛型,特别是正确的翻译方法是什么

Class<? extends Event> 

到 Kotlin,保持与上面的 Java 代码相同的行为。

提前致谢。

【问题讨论】:

  • 简而言之,Java &lt;? extends Event&gt; 的等价物是&lt;out Event&gt;。它解决了你的问题吗?如果没有,还可以更轻松地查看您的 Kotlin 代码。此外,如果有兴趣,请参阅参考资料的 Generic Variance 部分以了解 Kotlin 泛型。
  • 哇,确实解决了!我已经阅读过文档,并且已经尝试过 。但是在阅读了您的评论后,我再次尝试,只是注意到其他地方出现了一个愚蠢的错误,它无法正常工作......谢谢! :)
  • @Frank 您甚至可以发布一个答案,说明它是如何解决它的,这样如果其他人偶然发现您的问题,他们可能会从您获得的清晰度中受益。

标签: java generics reflection kotlin


【解决方案1】:

感谢您的帮助;这将是在 Kotlin 中执行此操作的方式:

// <? extends Event> in Java ==> <out Event> in Kotlin.
val myList: MutableList<Class<out Event>>

val param: Class<*> = methodThatHasSomeEventAsParam.parameterTypes[0]

if (Event::class.java.isAssignableFrom(param)) {
    param as Class<out Event>
    myList.add(param)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多