【发布时间】: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<Q, R>接口而不是IntCalculator、FloatCalculator和Calculator接口。 附言我假设您是program to an interface,因此您必须创建Generic<Q, R>或IntCalculator、FloatCalculator和Calculator。
标签: java generics inheritance kotlin polymorphism