Приведенный выше код не будет компилироваться, потому что вы пытаетесь использовать оператор +
в универсальном классе, но универсальный класс не знает, что вы работаете с числами.Что касается компилятора, типы 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
.Однако я не думаю, что это хорошая идея, так как любое преобразование может вызвать проблемы, например, округление и т. Д.
Возможно, в данном конкретном случае дженерики не являются правильным решением.Если вы просто пытаетесь разобраться с дженериками, возможно, найдите другой пример или создайте несколько пользовательских классов, которые являются производными от общего базового класса, и поработайте с ними вместо этого.