Общий класс Kotlin для математических чисел - PullRequest
0 голосов
/ 30 ноября 2018

, поэтому я просто изучаю универсальные классы с помощью программирования на языке Kotlin, я просто пишу код, который математически рассчитывает числа с универсальным классом, но я не знаю, в чем именно проблема

Мой код:

class Third<D, E> {    
    var num1: D? = null
    var num2: E? = null

    fun print_math_formula(b: D, c: E) {        
        val code_of_Formula: Int = 1
        val num1 = b
        val num2 = c

        var num1+num2
    }

}

fun main(args: Array<String>){
   var obj4 = Third<Int, Int>()
   obj4.print_math_formula(5, 6)
}

1 Ответ

0 голосов
/ 30 ноября 2018

Приведенный выше код не будет компилироваться, потому что вы пытаетесь использовать оператор + в универсальном классе, но универсальный класс не знает, что вы работаете с числами.Что касается компилятора, типы D и E могут быть чем угодно, например, двумя совершенно не связанными объектами.Так что он не может просто сложить их вместе.

Универсальный класс следует использовать, когда у вас есть класс, который работает универсальным образом с данным типом объекта.Например, стандартный тип List является универсальным классом, поскольку он может хранить список объектов данного типа.Если вы создаете экземпляр List<String>, этот экземпляр может хранить список строк.Если вы создаете экземпляр List<Int>, этот экземпляр хранит список целых чисел.

В вашем случае вы делаете нечто более конкретное, которое работает только с определенными типами, например числами.Теперь вы можете при создании универсального класса сказать, что тип объекта, с которым он может работать, ограничен, например, реализует некоторый интерфейс.Так что в вашем случае, если вы знаете, что этот класс всегда будет работать с числами, вы можете сказать, что ваш класс работает только с подклассами Number, например:

class Third<D: Number, E: Number>

Int, Long,и т.д., все подклассы Number.Однако в этом конкретном случае это вам мало поможет, поскольку оператор + не входит в базовый класс Number: он реализован по-разному для каждого из подклассов.Указание, что типы D и E должны быть подклассами Number, позволит вам вызывать только методы, которые существуют в самом классе Number.Например, вы можете сделать это:

val test = num1.toDouble() + num2.toDouble()

Поскольку toDouble объявлен как метод в классе Number.Однако я не думаю, что это хорошая идея, так как любое преобразование может вызвать проблемы, например, округление и т. Д.

Возможно, в данном конкретном случае дженерики не являются правильным решением.Если вы просто пытаетесь разобраться с дженериками, возможно, найдите другой пример или создайте несколько пользовательских классов, которые являются производными от общего базового класса, и поработайте с ними вместо этого.

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