在Kotlin中限制伴随对象的类型

时间:2019-09-21 09:56:11

标签: kotlin interface

我想创建一个带有打印方法的接口,该方法将打印一个带后缀的值。 所以:

interface Unitary<T>{
    val value: T
    fun print(){
        print(value)
        println(suffix)
    }
}

interface HasSuffix{
    val suffix: String
} 

inline class Centimeters(val value: Double): Unitary<Double>{
    companion object: HasSuffix{
        override val suffix = "cm"
    }
} 

当前我收到错误:

  

未解决的参考文献:后缀

是否有一种方法可以表明后缀将在任何实现接口的伴随对象上声明?

2 个答案:

答案 0 :(得分:5)

  

是否有一种方法可以表明后缀将在任何实现接口的伴随对象上声明?

我认为没有。

您可以使用以下方法解决此问题:

interface Unitary<T>{
    val value: T

    fun suffixProvider() : SuffixProvider

    fun print(){
        print(value)
        println(suffixProvider().suffix)
    }
}

interface SuffixProvider{
    val suffix: String
} 

inline class Centimeters(override val value: Double): Unitary<Double>{
    companion object: SuffixProvider{
        override val suffix = "cm"
    }

    override fun suffixProvider() = Centimeters

} 

答案 1 :(得分:2)

您不能强迫子类通过伴侣对象提供特定的功能。相反,您可以强制它们提供特定的方法。类如何实现此方法取决于他们。