class A {
boolean f(A a) { return true; }
}
class B extends A {
boolean f(A a) { return false; } // override A.f(A)
boolean f(B b) { return true; } // overload A.f
}
void f() {
A a = new A();
A ab = new B();
B b = new B();
ab.f(a); ab.f(ab); ab.f(b); //(1) false, false, *false*
b.f(a); b.f(ab); b.f(b); //(2) false, false, true
}
你能解释一下第一行最后一个false输出,为什么它不是真的吗?
你能解释一下第一行最后一个false输出,为什么它不是真的吗?
AB
的编译时类型是A
,因此编译器--执行重载解析--确定唯一有效的方法签名是F(A)
,因此调用它。
在执行时,该方法签名作为B.F(aa)
执行,因为B
会重写它。
请始终记住,签名是在编译时选择的(重载),而实现是在执行时选择的(重写)。
问题内容: 请显示一个有关Java中协方差和逆方差的好例子。 问题答案: 协方差: Sub#getSomething是协变的,因为它返回Super#getSomething的返回类型的子类(但完全填充了Super.getSomething()的协定) 逆差 Sub#doSomething是互变的,因为它采用了Super#doSomething的参数的超类的参数(但是,再次填充了Super#doSo
问题内容: 谁能解释我,编程语言理论中协变和逆变的概念吗? 问题答案: 协方差 非常简单,最好从某些收集类的角度来考虑。我们可以 参数化 的一些类型参数类。也就是说,我们的列表包含some 类型的元素。如果,列表将是协变的 S是Tiff列表的子类型List [S]是List [T]的子类型 (在这里,我使用数学定义 iff 表示 当且仅当 。) 也就是说,a 是一个 。如果有一些例程接受a 作为参
我正在学习Scala中的函数式编程原理,在学习子类型和泛型时,我对协方差有一个困惑: 给定:或是的子类型 编辑: 下面是的定义:
问题内容: 协方差(大致)是在使用它们的复杂类型中 镜像 “简单”类型的 继承 的能力。 例如,我们始终可以将的实例视为的实例。如果ComplexType是协变的,则可以将A 视为a 。 我想知道:协方差的“类型”是什么,它们与C#有什么关系(是否支持它们?) 代码示例将很有帮助。 例如,一种类型是Java支持的 返回类型covariance ,但C#不支持。 我希望有功能编程知识的人也能加入!
本文向大家介绍协方差与相关性的区别?相关面试题,主要包含被问及协方差与相关性的区别?时的应答技巧和注意事项,需要的朋友参考一下 相关性是协方差的标准化格式,协方差本身很难做比较,例如,如果我们计算工资和年龄的协方差,因为这两个变量有不同的度量,所以我们会得到不能做比较的不同的协方差,为了解决这个问题,我们计算相关性来得到一个介于-1和1之间的值,就可以忽略它们各自不同的度量
问题内容: 可以说我们有一个包含此类的程序: 容易吧?好吧,可以说我们现在想要制作这样的方法(在某个随机类中): 现在的问题是,在Java的泛型集合不是协变的(希望这是我要找的术语),我不能分配给一个。我在这里看到的唯一解决方案是复制代码并为每种类型做一个版本,但这显然很糟糕(如果我们有更多的类用不同的列表实现AbstractToolbox会怎样?)。哦,显然,第二种解决方法是删除泛型并创建一个普