雨课堂知识点总结(十四)

5.2

subtyping

1.
Behavioral subtyping必须要满足的条件,不包括以下_

A
子类型可以增加父类型中所没有的新方法
B
子类型override父类型的某方法,子类型方法需具备相同或更弱的post-condition
C
子类型必须要具备与父类型相同或更弱的invariants(不变量)
D
子类型override父类型的某个方法,不能比父类型方法抛出新的异常类型,但可比父类型方法抛出的异常更少
正确答案:BC
2.
关于Behavioral subtyping的说法,不正确的是_

A
子类型override父类型某个方法,其返回值类型应该与父类型方法的返回值类型相同或者更具体(子类型)
B
子类型override父类型某个方法,其参数的类型应该与父类型方法的参数类型相同或者更具体
C
某个类是immutable的,它可以派生出一-个mutable的子类
D
子类型override父类型某个public方法,子类型中该方法的可见性可以为private
答案:BCD

C选项: java允许你这么设计, statictype checking也可以通过,但却是违反LSP的,因为immutable也是invariant (不变量),子类型的

invariant应该等于或强于父类型,而一个mutable的子类型就不再具备这个invariant。

D选项:把一个public方法override为private方法,那么如果用子类型的对象取代父类型对象,就无法调用这个操作了,所以无法取代,所以违反LSP。

3.
public class A {
public object a (String d) {
return "";}}
public class B extends A {
@Override
public String a (Object d) {
return null;}

}
该段Java代碣是否能通辻statictype checking?
A:能
B:不能
正确答案:B
答案解析:
虽然方法a在类A和类B里符合
covariance和contra-variance ,但因为Java不支持contra-variance ,这里的@Override是不能成立的。
4.
public class A {
public object a (String d) {
return "" ;}}
public class B extends A {
public String a (0bject d) {
return null;}}
亥段Java代碣是否能通辻statictype checking?
A 能
B 不能
正硝答案: A
解析:方法a在类A和类B里符合covariance和contra-variance,但因为java不支持contra-variance,于是
编译器就把B中的a方法看做A中a方法的overload
5.
void print(List<Object> list)
{...}
以下__作为参数传递进去不是对它的合法调用?
A: List<Integer> a;
B List<?> a;
C: Arraylist<Integer> a;
D: List<? extends Object> a;
E: List<Object> a;
答案:abcd
6.
void print
(List<? extends Number> list)
{...}
以下__作为参数传递进去不是对它的合法调用?
A: List<Integer> a;
B: List<?> a;
C: ArrayList<Integer> a;
D: List<? extends Integer> a;
E: List<0bject> a;
正确答案:BE

猜你喜欢

转载自www.cnblogs.com/HIT-ryp/p/10683111.html