问题:在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
代码使我感到怀疑。他们只是超载了。不过,很高兴知道这是否可能。
谢谢
答案 0 :(得分:1)
不幸的是,答案是:
不,目前没有。
Type classes提议(或类似的提议)将解决它,如果它被接受(诸如Mathable
这样的类型类)。
即使在具有
*
或times
的任何东西上
这称为结构类型,我认为Kotlin不会计划任何类似的事情。