2 операторные функции перегрузки одного типа - PullRequest
0 голосов
/ 07 марта 2019

Я делаю упражнение Kotlin Koans по перегрузке оператора и мне интересно, как компилятор выбирает, какую MyDate.plus() функцию использовать:

import TimeInterval.*
import java.util.Calendar

data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)

enum class TimeInterval { DAY, WEEK, YEAR }

operator fun MyDate.plus(timeInterval: TimeInterval) = addTimeIntervals(timeInterval, 1)

class FullTimeInterval(val timeInterval: TimeInterval, val number: Int) 
operator fun TimeInterval.times(number: Int) = FullTimeInterval(this, number)

operator fun MyDate.plus(timeIntervals: FullTimeInterval) 
= addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)

fun task1(today: MyDate): MyDate {
    return today + YEAR + WEEK 
}

fun task2(today: MyDate): MyDate {
    return today + YEAR * 2 + WEEK * 3 + DAY * 5
}  

1 Ответ

2 голосов
/ 07 марта 2019

У вас есть два класса: TimeInterval и FullTimeInterval и две перегруженные функции: MyDate.plus(timeIntervals: TimeInterval) и MyDate.plus(timeIntervals: FullTimeInterval)

Компилятор знает тип аргумента и выбирает ближайшую функцию по сигнатуре,Решение принимается во время компиляции и зависит от вычисленных типов аргументов.

Дополнительную информацию можно найти по адресу https://jetbrains.github.io/kotlin-spec/#overload-resolution

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...