2017-02-07 7 views
2

편집 1 : 변경된 제목, 나쁨.코 틀린 반사 + 제네릭

class CustomEvent : Event { ... } 

내가 지금 할 노력했습니다 것은 : 맞춤 이벤트 처럼

interface Event 

그리고 그것을 구현하는 몇 가지 클래스 :

나는 인터페이스를 이벤트이 주어진 매개 변수로 이벤트가있는 메소드 (예 : 이벤트 인터페이스를 구현하는 모든 클래스)는

과 같습니다.
fun onCustomEvent(event: CustomEvent) { 
    ... 
} 

, 해당 이벤트를 목록에 추가하고 싶습니다. 따라서이 목록은 여러 이벤트를 개최하게됩니다.

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

그러나 코 틀린에 관해서는, 정말 방법을 잘 모르겠어요 :


자바
에서 나는 이런 식으로 뭔가 (100 % 정확하지 않을 수 있습니다)을 것 보라 제네릭을 올바르게 사용하려면 구체적으로 번역 할 수있는 번역 방법이 무엇이 될까요?

Class<? extends Event> 

에서 Kotlin으로 위의 Java 코드와 동일한 동작을 유지합니다.

미리 감사드립니다.

+2

간단히 말해서 Java의 '는''입니다. 그것은 당신의 문제를 해결합니까? 그렇지 않다면 Kotlin 코드를 더 쉽게 볼 수 있습니다. 또한 관심이있는 경우 Kotlin 제네릭에 대해 알아 보려면 참고 자료의 [* Generic Variance *] (https://kotlinlang.org/docs/reference/generics.html#variance) 섹션을 참조하십시오. – hotkey

+1

와우, 실제로 해결 됐어! 나는 이미 문서를 읽고 있었고, 이미 시도했다 . 그러나 당신의 코멘트를 읽은 후에 나는 다시 시도했고 어딘가에 어리석은 실수를 발견했다. 그렇지 않으면 작동하지 않을 것이다 ... 감사합니다! :) – Francisco

+1

@ 프랭크 다른 사람들이 당신의 질문에 걸려 넘어지면 당신이 얻은 선명도로부터 이익을 얻을 수 있도록 당신이 그것을 해결하는 방법을 명확히하는 대답을 게시 할 수도 있습니다. – mfulton26

답변

3

도움 주셔서 감사합니다. 이것은 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) 
}