java - 非通用子类继承(实现)通用父类(super class)(接口(interface))

标签 java generics inheritance kotlin polymorphism

当非泛型子类具有父泛型父类(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/

相关文章:

python - 如何在 BaseClass 方法被 Python 中的 DerivedClass 方法覆盖之前执行它

C# 继承 : implements + extends

c++ - this-> 是否必须从派生类访问 Base<T> 标识符?

java - 如果我禁用授权,如何在测试中模拟安全上下文

java - 扩展类时出错

c# - 使用泛型和后期绑定(bind)的反射。如何在运行时转换?

java - 无法从 WebElement 转换为 List<WebElement>

c# - 使用受约束的泛型而不是接口(interface)——缺点?

java - 我正在尝试将 mongodb 与 spring boot 连接。我很困惑何时使用以下 : 中的哪个 Maven 依赖项

java - Spring 配置文件中的 Liquibase 文件路径