Kotlin通用约束具有“任何”而不是“全部”

时间:2018-07-08 11:57:43

标签: generics kotlin where-clause

问题:在Kotlin中是否有一种方法可以约束泛型类型,使其可以是类型列表的分离,也可以是“凡具有函数foo”,而不是约束的结合?

where T:Type1, T:Type2<Foo>

表示T必须符合Type1和Type2

但是,例如,如果我想使用sqr扩展Math,该sqr可以对内置数字类型进行操作:

fun <T> Math.sqr(op:T): T 
    where T:Int or Long or Float or Double = op * op

或什至具有*times的任何东西:

fun <T> Math.sqr(op:T): T
    where T: can do times // like "responds to selector" in Obj-C
    = op.times(op)

这样的事吗? 后者比较凉爽,因为T可以是“复杂”,也可以是定义有“ *”作为其内积的向量...只需想象并实现。

从理论上讲,我本可以发明一组继承自“ Math-able”的“原语”,但这很丑陋,因为这意味着我需要使用自己的一组变量。

interface Mathable {
    fun plus(m:Mathable)
    fun minus(m:Mathable)
    fun times(m:Mathable)
    fun div(m:Mathable)
}

class Int2 : Number, Comparable<Int2>, Mathable

就像(相对而言,当然)丑陋

inline fun <reified T:Number> sqr(n:T):T {
    return where n {
        is Int -> n * n
        is Float -> n * n
        is Whatever -> n * n
        ....
        else -> throw SomeException("huh?!")
    }
}

有更好/更凉爽的方法吗?

更新:检查Kotlin class Int代码使我感到怀疑。他们只是超载了。不过,很高兴知道这是否可能。

谢谢

1 个答案:

答案 0 :(得分:1)

不幸的是,答案是:

  1. 不,目前没有。

  2. Type classes提议(或类似的提议)将解决它,如果它被接受(诸如Mathable这样的类型类)。

  3.   

    即使在具有*times的任何东西上

    这称为结构类型,我认为Kotlin不会计划任何类似的事情。