如何制作一个Kotlin可比较类型?
只是学习定义DateRange类型
val wholeYear2017 = Date(2017,1,1)..Date(2017,12,31)
所以我创建了如下的类型
class DateRange<Date: Comparable<Date>>(override val start: Date, override val endInclusive: Date) : ClosedRange<Date> class Date (val year: Int, val month: Int, val day: Int) { operator fun compareTo(other: Date): Int { if (this.year > other.year) return 1 if (this.year < other.year) return -1 if (this.month > other.month) return 1 if (this.month < other.month) return -1 if (this.day > other.day) return 1 if (this.day < other.day) return -1 return 0 } operator fun rangeTo(that: Date): DateRange = DateRange(this, that) }
但是我有一个编译错误
One type of argument expected for class DateRange<Date: Comparable<Date>> : ClosedRange<Date>
我错过了什么? 我做得对吗?
你的问题真的是关于如何创建一个Comparable类型? 然后让你的类型实现Comparable接口(重写compareTo
)。
class Date(val year: Int, val month: Int, val day: Int) : Comparable<Date> { override operator fun compareTo(other: Date): Int { if (this.year > other.year) return 1 if (this.year < other.year) return -1 if (this.month > other.month) return 1 if (this.month < other.month) return -1 if (this.day > other.day) return 1 if (this.day < other.day) return -1 return 0 } }
您不需要rangeTo
方法,因为所有Comparable<T>
类型都有一个已经定义的rangeTo
扩展。 请参阅范围和范围 。 但是,如果你仍然想要自己的DateRange
类型(用于其他目的), DateRange
类的更简单的形式将是…
class DateRange(override val start: Date, override val endInclusive: Date) : ClosedRange<Date>
换句话说, DateRange
上不需要泛型参数。
然后你会写你自己的rangeTo
操作符。 或者,将operator fun rangeTo
添加到Date
类中,或者提供一个根级别的扩展函数(我的首选项与Kotlin库方法一致)。 两者都会隐藏/隐藏Date
类型的Comparable<T>.rangeTo
扩展函数。
// class level rangeTo operator operator fun rangeTo(that: Date) = DateRange(this,that) // root level extension operator fun Date.rangeTo(that: Date) = DateRange(this,that)
你几乎在那里:
首先,你必须让你的班级Comparable
:
class Date (val year: Int, val month: Int, val day: Int): Comparable<Date> {
其次,你必须指定返回类型的泛型,或者只是省略它(让编译器推断它)
operator fun rangeTo(that: Date): DateRange<Date> = DateRange(this, that) operator fun rangeTo(that: Date) = DateRange(this, that)