Почему нельзя использовать методы с одинаковыми именами, но с разными обобщениями?

Я довольно новичок в языке Kotlin, но я только что столкнулся с некоторым странным поведением, которого не было в других языках, поэтому я хотел спросить, почему я не могу сделать что-то вроде этого:

fun <T> methodName()
{
    // whatev~ 
}

fun <T, K> methodName()
{
    // whatev~   
}

Этот код выдает ошибку "Конфликтующие перегрузки".

В других языках, например C#, я могу это сделать, и это довольно изящная уловка - иметь только один метод, который работает для одного или нескольких типов одновременно.

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

fun <T> methodName()
{

}

fun <T, K> methodName(crappyParam: String = "")
{

}

1 ответ

Два метода будут иметь одинаковую сигнатуру в системе типов JVM (которая не поддерживает обобщенные типы), что недопустимо.

Язык JVM может "искажать" такие методы, например, давая им разные имена в байт-коде. Реализация JVM C# должна была бы.

Но Котлин не делает. И это повредит совместимости с Java, что является одним из основных требований Kotlin.

Другие вопросы по тегам