非泛型子类继承(实现)泛型超类(接口)

时间:2019-11-05 16:22:40

标签: java generics inheritance kotlin polymorphism

当非泛型子类具有父泛型超类/接口时,以下模型有什么好处?

interface Generic<Q: Number, R: Number> {

    fun calculate(input: Q): R
}

class ClassA: Generic<Int, Int> {

    override fun calculate(input: Int): Int {
        return input
    }
}

class ClassB: Generic<Float, Float> {

    override fun calculate(input: Float): Float {
        return input
    }
}

多态性始终无法使用(需要使用模式匹配进行显式转换)。没有继承/实现也可能获得相同的结果:

fun main() {
    val classA: Generic<Int, Int> = ClassA()
    val classB: Generic<Float, Float> = ClassB()
    val inputs: List<Number> = listOf(1, 1.1, 2, 2.2)

    for (input in inputs) {
        when (input) {
            is Int -> classA.calculate(input)
            is Float -> classB.calculate(input)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据您当前的设置,我认为拥有Generic接口并不是完全必要的。但是,随着代码的扩展,我认为它会有所帮助。

现在使用该方法的一个优点是,您现在拥有两个具有相同方法名称和相似方法签名的相似类。通过继承Generic,可以避免键入caluclate而不是calculate的错字。有些人可能不认为这是一个正当的理由,但我认为在这种情况下使用该接口可使您的代码更加一致。

在实际需要引用Generic时会带来好处。

interface Calculator<T : Number, K : Generic<T>> {
    fun calculate(generic: K): T
}
class DefaultCalculator...

上面的代码只是一个示例,在您的用例中可能不切实际,但是如果您认为将来可能需要它,那么现在使用Generic接口可以为您节省一些重构。