【问题标题】:Non-Generic Subclasses inherits (implements) Generic Superclass (Interface)非泛型子类继承(实现)泛型超类(接口)
【发布时间】:2020-03-02 01:42:51
【问题描述】:

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

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)
        }
    }
}

【问题讨论】:

  • 这个模型的主要好处是你只需要创建一个Generic&lt;Q, R&gt;接口而不是IntCalculatorFloatCalculatorCalculator接口。 附言我假设您是program to an interface,因此您必须创建Generic&lt;Q, R&gt;IntCalculatorFloatCalculatorCalculator

标签: java generics inheritance kotlin polymorphism


【解决方案1】:

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

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

使用Generic 的优势在于您确实需要引用它。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    相关资源
    最近更新 更多