5.2
subtyping
1.
Behavioral subtyping必须要满足的条件,不包括以下_A
子类型可以增加父类型中所没有的新方法B子类型override父类型的某方法,子类型方法需具备相同或更弱的post-conditionC子类型必须要具备与父类型相同或更弱的invariants(不变量)D子类型override父类型的某个方法,不能比父类型方法抛出新的异常类型,但可比父类型方法抛出的异常更少正确答案:BC2.关于Behavioral subtyping的说法,不正确的是_A
子类型override父类型某个方法,其返回值类型应该与父类型方法的返回值类型相同或者更具体(子类型)B子类型override父类型某个方法,其参数的类型应该与父类型方法的参数类型相同或者更具体C某个类是immutable的,它可以派生出一-个mutable的子类D子类型override父类型某个public方法,子类型中该方法的可见性可以为private答案:BCDC选项: 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 { @Overridepublic 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方法的overload5.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;答案:abcd6.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