如何制作一个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)