当非泛型子类具有父泛型超类/接口时,以下模型有什么好处?
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)
}
}
}
答案 0 :(得分:1)
根据您当前的设置,我认为拥有Generic
接口并不是完全必要的。但是,随着代码的扩展,我认为它会有所帮助。
现在使用该方法的一个优点是,您现在拥有两个具有相同方法名称和相似方法签名的相似类。通过继承Generic
,可以避免键入caluclate
而不是calculate
的错字。有些人可能不认为这是一个正当的理由,但我认为在这种情况下使用该接口可使您的代码更加一致。
在实际需要引用Generic
时会带来好处。
interface Calculator<T : Number, K : Generic<T>> {
fun calculate(generic: K): T
}
class DefaultCalculator...
上面的代码只是一个示例,在您的用例中可能不切实际,但是如果您认为将来可能需要它,那么现在使用Generic
接口可以为您节省一些重构。