Ответ 1
После поиска в Google правильном ответе будет:
fun <T : X> doSomething() {
}
Как можно обеспечить общий тип метода в Котлин? Я знаю, например, вы можете сделать следующее:
var someVar: MutableSet<out SomeType> = hashSetOf()
Как вы можете сделать то же самое для метода?
fun <T> doSomething() {
}
Я хотел бы применить T
к типу X
или его подтипу.
Спасибо.
После поиска в Google правильном ответе будет:
fun <T : X> doSomething() {
}
Фактически out SomeType
означает больше, чем "Тип Parameter может быть SomeType или любой из его подтипов", как предлагают ваши вопросы.
Ключевое слово out
- это способ Котлина сказать, что в этом примере MutableSet
является производителем SomeType
, т.е. ковариантным в своем параметре типа. Как следствие, вы не сможете вызывать методы типа add(t:T)
, а только те, которые возвращают T
s, например get():T
.
Вернемся к вашему вопросу: если ваш метод должен принимать типы X
или его подтипы, вы должны использовать "границы":
fun <T : X> doSomething() {
}
Это именно то, что вам нужно, но чтобы снова прояснить это, нельзя сказать, что оно эквивалентно вашему другому примеру.
как @s1m0nw1, вы можете использовать
fun <T : X> doSomething() {
}
чтобы ограничить T подтип X,
дополнительно, вы можете использовать
fun <T> doSomething where T : Comparable, T : Cloneable {
}
для ограничения T должен реализовывать как Comparable
, так и Cloneable
как указано здесь https://kotlinlang.org/docs/reference/generics.html