gpt4 book ai didi

java - 给出在 Java 中重载和覆盖的情况下演示协变和逆变的函数示例?

转载 作者:IT老高 更新时间:2023-10-28 11:28:43 24 4
gpt4 key购买 nike

请举一个Java中协变和逆变的好例子。

最佳答案

协方差:

class Super {
Object getSomething(){}
}
class Sub extends Super {
String getSomething() {}
}

Sub#getSomething 是协变的,因为它返回 Super#getSomething 的返回类型的子类(但满足 Super.getSomething() 的约定)

逆变

class Super{
void doSomething(String parameter)
}
class Sub extends Super{
void doSomething(Object parameter)
}

Sub#doSomething 是逆变的,因为它接受 Super#doSomething 参数的父类(super class)的参数(但同样,完全履行 Super#doSomething 的契约)

注意:此示例不适用于 Java。 Java 编译器会重载并且不会覆盖 doSomething() 方法。其他语言确实支持这种逆变方式。

泛型

这也适用于泛型:

List<String> aList...
List<? extends Object> covariantList = aList;
List<? super String> contravariantList = aList;

您现在可以访问 covariantList 的所有不带泛型参数的方法(因为它必须是“扩展对象”的东西),但 getter 可以正常工作(因为返回的对象将始终是“对象”类型)

contravariantList 则相反:您可以使用泛型参数访问所有方法(您知道它必须是“String”的父类(super class),因此您始终可以传递一个),但没有 getter (返回的类型可以是 String 的任何其他父类(super class)型)

关于java - 给出在 Java 中重载和覆盖的情况下演示协变和逆变的函数示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501023/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com