Попытка использовать Kotlin параметры типа reified с библиотечным классом - PullRequest
0 голосов
/ 06 апреля 2020

Я использую библиотеку JGraphT из Kotlin и хочу, чтобы мой график был параметризован. Однако способ, которым я пытался это сделать, не работает, так как U не определен во время компиляции и не может быть использован для отражения. Поэтому я получаю сообщение об ошибке «Невозможно использовать T в качестве параметра типа reified. Вместо этого используйте класс». Насколько я знаю, параметры встроенного типа могут использоваться для встроенных функций для решения этой проблемы, но я не могу понять, как это могло бы мне помочь, особенно зная, что я не могу изменить код библиотеки. Любые идеи будут оценены.

class GraphManipulation<T,U> {
    val g = DefaultDirectedGraph<T, U>(U::class.java)
...}

1 Ответ

0 голосов
/ 06 апреля 2020

Проблема не в использовании DefaultDirectedGraph, а в том, что U не реализован в вашем классе GraphManipulation. Поскольку классы не могут иметь параметры класса reified (пока?), Вам нужно взять класс в качестве параметра конструктора:

class GraphManipulation<T,U>(private val uClass: Class<U>) {
    val g = DefaultDirectedGraph<T, U>(uClass)
}

Где reified может помочь, это сделать вспомогательный метод

inline fun <T, reified U> GraphManipulation(): GraphManipulation<T,U> = GraphManipulation(U::class.java)
...