我正在攻读考试,我需要一些帮助才能理解以下剪辑代码中发生了什么.
class A {
public void method1(A X) {
System.out.println("A");
}
}
class B extends A {
public void method2() {
System.out.println("B");
}
}
class C extends B {
public void method1(A x) {
System.out.println("C");
}
}
class D extends C {
public void method1(D x) {
System.out.println("D");
}
}
public class test {
public static void main(String[] args) {
C c = new D();
B b = c;
c.method1(c); // prints C
b.method1(b); // prints C
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,这就是我的想法:c.method1(c)在C中调用method1而在D中调用method1,因为c作为C是decleard,因此D中的method1不可见.但是b.method1(b)更难.B没有method1,我假设将使用超类中的method1,但事实并非如此.为什么在C中使用该方法?我在B中添加了一个新的D但是D的特化没有任何可见,因为b来自B型.
我想了解 Knuth\xe2\x80\x93Morris\xe2\x80\x93Pratt 算法的工作原理。我在普林斯顿大学观看了本教程https://www.youtube.com/watch?v=iZ93Unvxwtw。在此视频中,他们使用一个表格,其中字母表长度 = 行数,模式长度 = 列数。将该表视为 DFA,用于检测文本中的模式。我认为这种方法很有趣,但维基百科说 Knuth\xe2\x80\x93Morris\xe2\x80\x93Pratt 算法使用一个前缀表,其中只有一行前缀的长度。两者都有效,并且两者的速度都是 O(n+m)(n 是文本的长度,m 是模式的长度)。但DFA版本需要更多空间。但问题是哪个是真正的 Knuth\xe2\x80\x93Morris\xe2\x80\x93Pratt 算法,哪个是微分?
\n我正在学习关于Haskell的考试.我不明白我如何确定函数的类型.功能是:
func [] f = 16
func (h : t) f = (f h) + (func t f)
Run Code Online (Sandbox Code Playgroud)
我的猜测是第一行有这种类型:empty list -> a -> awhere a必须是数字类型.在Haskell表示法中Num a => [] -> a -> a,第二行有这种类型:[a]-> a -> ?它返回什么?也许(a, a)因为 (f h)是一个元组.怎么样(func t f),是a或?我如何将两条线混合在一起?