Kotlin универсальная c функция - PullRequest
2 голосов
/ 12 января 2020

Я написал обобщенный класс Complex для представления комплексного числа и хочу, чтобы можно было хранить внутренние числа по типу, переданному пользователем типа. И функцию add_complex() для добавления двух комплексных чисел.

class Complex<T: Number>(val real:T, val imagine:T)

fun<T:Number> add_complex(l:Complex<T>, r:Complex<T>): Complex<T>
{
    return Complex(l.real+r.real, l.imagine+r.imagine)
}

fun main()
{
    var x=Complex<Int>(2,3)
    var y=Complex<Int>(4,5)
    var sum=add_complex(x,y)
    print("${sum.real},${sum.imagine}i")
}

Компилятор выдает длинный список сообщений об ошибках о возможном совпадении функции plus. Но я не знаю, в чем проблема, и ссылка kotlin не предоставила много информации о функциях generi c. И я пришел из C ++, и у меня есть грубое понимание шаблонов C ++. Будет очень признательно, если кто-то сможет объяснить основное различие между шаблонами C ++ и kotlin шаблонами.

Ответы [ 2 ]

1 голос
/ 12 января 2020

Разница с шаблонами C ++ заключается в том, что в C ++ компилятор просто заменяет типы шаблонов для создания новых специализированных типов, новых функций и т. Д. c.

Таким образом, X и X заканчиваются это два новых класса, в то время как в Kotlin есть только один класс X, и, кроме того, в Kotlin во время выполнения стираются универсальные типы c (ie во время выполнения Integer и Double просто исчезают, они нужны только компилятором). Здесь C ++ просто создает класс Complex и использует его.

В Kotlin проблема здесь заключается в том, что сложение заканчивается тем, что оно является операцией сложения, которая должна знать, является ли она добавлением long , из поплавков, et c. А поскольку универсальные c типы удалены, и существует только один сложный класс, он должен обрабатывать все возможности. Таким образом, ваш код должен быть изменен для обработки каждого такого случая. Или по умолчанию для одного типа, как это:

class Complex<T: Number>(val real:T, val imagine:T) {
    fun add(o: Complex<T>): Complex<Double> {
        var r = real.toDouble() + o.real.toDouble()
        var i = imagine.toDouble() + o.imagine.toDouble()
        return Complex(r, i)
    }
}

или

fun<T:Number> add_complex(l:Complex<T>, r:Complex<T>): Complex<Double> {
    return Complex(l.real.toDouble() +r.real.toDouble(), l.imagine.toDouble()+r.imagine.toDouble())
}
0 голосов
/ 12 января 2020

В C ++ шаблон кода генерируется для каждой специализации и затем компилируется. Здесь это работает по-другому. Нет поколения, тот же код, который вы написали, вызывается для всех случаев. Нет чистого способа сделать то же самое в kotlin. Даже этот код выдает ошибку:

val x:Number = 1.0;
val z:Float = 2.0f;

val r = x + z;

Числовой класс не определяет никакой оператор плюс. Вам нужно вручную проверить, с каким типом вы имеете дело, и затем вызвать функцию плюс. В сообщении об ошибке, я полагаю, вы получили, что ни одна из функций plus () не подходит для вашего случая.

Проверьте этот ответ или Google "kotlin generi c number function"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...