2017-02-07 2 views
2

EDIT 1: Изменено название, мое плохое.Kotlin reflection + generics

меня есть интерфейс событие:

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. 
} 

Но для Котлин, я действительно не знаю, как правильно использовать дженерики, в частности, что будет правильным способом для перевода

Class<? extends Event> 

в Kotlin, сохраняя то же поведение, что и код Java выше.

Заранее спасибо.

+2

В двух словах эквивалент Java ' 'is' '. Решает ли ваша проблема? В противном случае было бы легче увидеть ваш код Котлина. Кроме того, см. Раздел [* Generic Variance *] (https://kotlinlang.org/docs/reference/generics.html#variance) ссылки, чтобы узнать о дженериках Котлина, если они заинтересованы. – hotkey

+1

Woah, на самом деле это действительно решило! Я уже читал документы, и уже пробовал . Но после прочтения вашего комментария я снова попытался и только заметил глупую ошибку в другом месте, которая не заставит ее работать ... Спасибо! :) – Francisco

+1

@Frank Возможно, вы даже опубликуете ответ, разъясняющий, как он решает его, чтобы, если другие спотыкаются на ваш вопрос, они могут извлечь выгоду из ясности, которую вы получили. – mfulton26

ответ

3

Спасибо за помощь; это был бы способ сделать это в Котлине:

// <? 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) 
}