Детективы Котлина

Как можно обеспечить общий тип метода в Котлин? Я знаю, например, вы можете сделать следующее:

var someVar: MutableSet<out SomeType> = hashSetOf()

Как вы можете сделать то же самое для метода?

fun <T> doSomething() {
}

Я хотел бы применить T к типу X или его подтипу.

Спасибо.

Ответы

Ответ 1

После поиска в Google правильном ответе будет:

fun <T : X> doSomething() {
}

Ответ 2

Фактически out SomeType означает больше, чем "Тип Parameter может быть SomeType или любой из его подтипов", как предлагают ваши вопросы.

Ключевое слово out - это способ Котлина сказать, что в этом примере MutableSet является производителем SomeType, т.е. ковариантным в своем параметре типа. Как следствие, вы не сможете вызывать методы типа add(t:T), а только те, которые возвращают T s, например get():T.

Вернемся к вашему вопросу: если ваш метод должен принимать типы X или его подтипы, вы должны использовать "границы":

fun <T : X> doSomething() {
}

Это именно то, что вам нужно, но чтобы снова прояснить это, нельзя сказать, что оно эквивалентно вашему другому примеру.

Ответ 3

как @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