当非泛型子类具有父泛型父类(super class)/接口(interface)时,以下模型有什么好处?
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
接口(interface)并不是完全必要的。但是,当您扩展代码时,我认为它会有所帮助。
现在使用它的一个优点是您现在有两个相似的类,它们具有一致的方法名称和相似的方法签名。通过继承Generic
,可以避免输入calculate
而不是calculate
时出现的拼写错误。有些人可能不认为这是一个有效的理由,但我认为使用该接口(interface)可以使您的代码在这种情况下更加一致。
当您确实需要引用Generic
时,它的优势就显现出来了。
interface Calculator<T : Number, K : Generic<T>> {
fun calculate(generic: K): T
}
class DefaultCalculator...
上面的代码只是一个示例,可能在您的用例中并不实用,但如果您认为将来可能需要它,现在使用 Generic
接口(interface)可能会节省您一些重构。
关于java - 非通用子类继承(实现)通用父类(super class)(接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58715483/