2016-11-10 84 views
3

是否有可能实现一个通用的,比方说,除了类似如下:科特林,通用除了

public abstract interface NumberEx { 

    abstract fun plus(other: NumberEx): NumberEx 
} 

abstract interface Vec2t<T : NumberEx> { 

    open var x: T 
    open var y: T 

    fun add(res: Vec2t<T>, a: Vec2t<T>, bX: T, bY: T): Vec2t<T> { 
     res.x = a.x + bX 
     res.y = a.y + bY 
     return res 
    } 
} 

因为这里的编译器抱怨a.x + bXa.y + bY

类型不匹配。要求:t上找不到:NumberEx

+1

我看到“Kotlin,通用成瘾”:< – mklimek

+0

没关系,我们都是kotlin在这里上瘾。在b4 Kotlin匿名 – elect

回答

6

一种方法是采用递归NumberEx定义,像这样:

interface NumberEx<T : NumberEx<T>> { 
    operator fun plus(other: T): T 
} 

这将需要实施提供一个加号:

class ANumber : NumberEx<ANumber> { 
    override fun plus(other: ANumber): ANumber { 
     //TODO 
    } 
} 

而且会使编译器的类型安全并易于理解,可用于Vec2t

interface Vec2t<T : NumberEx<T>> { 
    ... 
} 
+0

谢谢,它的作品。还有一个问题,有没有办法获得扩展'NumberEx'的原始类型('Float','Int'等等)? – elect