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

我错过了什么? 我做得对吗?

2 Solutions collect form web for “如何制作一个Kotlin可比较类型?”

你的问题真的是关于如何创建一个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) 
  • 如何访问Koltin中的静态伴侣对象的实例变量
  • 如何在kotlin中进行多条件循环
  • 如何在Kotlin中使用KeyEvent
  • 计数Kotlin中的位数
  • 只有安全(?)或非空断言(!!)的电话才可以在一个可为空的接收器上
  • Kotlin获取jquery点击的目标
  • 如何选择在Kotlin派生类中重写哪个Java重载?
  • 在ConstraintLayout中使用组来侦听多个视图上的点击事件
  • 在kotlin中覆盖泛型的功能
  • 在Grails中可以使用Kotlin吗?
  • 如何在Kotlin中使用BigDecimal和BigInteger实现斯特林公式?
  • Kotlin language will be the best programming language for Android.