Почему нельзя использовать методы с одинаковыми именами, но с разными обобщениями?
Я довольно новичок в языке 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.