代码之家  ›  专栏  ›  技术社区  ›  kirtan403

Kotlin泛型返回类型以与接收器匹配

  •  2
  • kirtan403  · 技术社区  · 6 年前

    我试图创建一个函数,如果接收器的数字为空,则返回默认值。但是,当我检查接收值的类型时,它与接收器不匹配,而是与作为参数传递的默认值匹配。

    fun <T : Number> T?.orDefault(value: T): T = this ?: value
    

    用以下代码测试上述功能:

    fun main(args: Array<String>) {
        val b: Double? = null
        val default : Int = -1
        val orDefault = b.orDefault(default)
        println(orDefault)
        println(orDefault.javaClass.name)
    }
    

    输出如下:

    // Output:
    -1
    java.lang.Integer
    

    当我试着介绍另一个 J 延伸的 T ,这仍然失败。用上述主要方法运行仍然失败。

    fun <T : Number, J : T> T?.orDefault(value: J): T = this ?: (value as T)
    
    // Output:
    -1
    java.lang.Integer
    

    在所有情况下,它都不会返回double。这里怎么了?

    编辑 :

    我最后做了这样的事情:

    fun <T : Number, J : Number> T?.orDefault(value: J): T = this ?: (value as T)
    

    这样可以确保返回类型与接收器类型相同。然而,唯一的失败是空的。 Int 它将接受的接收者 Double 作为默认值并强制转换为 int 返回。

    3 回复  |  直到 6 年前
        1
  •  2
  •   gidds    6 年前

    orDefault() T Double Int Number 直接,如你所见。

    虽然你的第二个案子看起来更像你想要的,但我认为它仍在推断 所以演员表没有任何效果。

    最后,我认为您不能只使用一个扩展函数来完成您想要的工作。你不能投 int 在Kotlin(与Java不同);您需要调用它的 toDouble()

        2
  •  0
  •   Willi Mentzel user670265    6 年前

    Number

    第一条道路:

    fun Int?.orDefault(value: Int) = this ?: value
    fun Double?.orDefault(value: Double) = this ?: value
    // do the same for Float, Long, Char, Short and Byte 
    

    这将产生理想的行为。

    val default : Int = -1
    val orDefault = b.orDefault(default.toDouble()) 
    

    default Double 期待一个 双重的 默认情况下。


    fun Int?.orDefault(value: Number) = this ?: value.toInt()
    fun Double?.orDefault(value: Number) = this ?: value.toDouble()
    // do the same for Float, Long, Char, Short and Byte 
    
        3
  •  0
  •   kirtan403    6 年前

    fun <T : Number, J : Number> T?.orDefault(value: J): T = this ?: (value as T)
    

    唯一的问题是它可以从数字类型中接受任何默认值。和int一样,它可以接受双精度值作为默认值,并返回它的int表示形式。