当前位置:编程学习 > JAVA >>

一道让新手想吐血的范型考题。。。求助

本人不想解释自己有多初级了,只请高手帮忙解释一下这道OCJP的题目,先谢过了!

package com.ocjp.generic;

 public class Organic<E> {
 void react(E e) { }
 static void main(String[] args) {
//  Organic<? extends Organic> compound = new Aliphatic<Organic>();  //line 5;
//  Organic<? super Aliphatic> compound = new Aliphatic<Organic>();  //line 6;
 compound.react(new Organic());
 compound.react(new Aliphatic());
 compound.react(new Hexane());
 } 
 }
 
 class Aliphatic<F> extends Organic<F> { }
 class Hexane<G> extends Aliphatic<G> { }


Which, taken independently, are true? (Choose all that apply.)
A. If line 5 is uncommented, compilation fails due to an error at line 7.
B. If line 5 is uncommented, compilation fails due to an error at line 8.
C. If line 5 is uncommented, compilation fails due to an error at line 9.
D. If line 6 is uncommented, compilation fails due to an error at line 7.
E. If line 6 is uncommented, compilation fails due to an error at line 8.
F. If line 6 is uncommented, compilation fails due to an error at line 9.

答案是ABCD
ocjp generic --------------------编程问答--------------------
http://tieba.baidu.com/p/2033128717
--------------------编程问答-------------------- 56 和 67 行号是不是不对啊。。 --------------------编程问答-------------------- 1楼正解。不过可以解释得更清楚一些:
先说第一个:<? extends Organic>,代表这个类型是Organic的某一个子类(包括自己),而不是任何一个子类。所以“?”有可能是Aliphatic或者Hexane。所以编译器并不能断定react(new Organic())是否合法,这时候只能说它不合法了。
为了便于理解,你可以把第5行后面的Organic换成Aliphatic。这样以来,第5行仍然成立,第7行就能显然不对了。因为这时<E>是Aliphatic,而第7行尝试传入一个Organic。
你或许会问为什么Hexane不合法,因为显然不管这里的“?”是什么,它一定能符合。这就是编译器的问题了。它很懒,它虽然知道某个类的所有子类,但它不会根据这个信息来做进一步判断,甚至那一句"new"后面所跟的类型,它都不会去记,而只在赋值的那一行做一个类型检查,其判断依据只来源于变量声明,也就是<? extends Organic>。所以Hexane也不能幸免地出局了:编译器虽然知道它是否没有子类,但并不利用这一点来判断语句的合法性。实际情况比这个还简单,编译器是不会看它是否有子类的,react这个函数,除了null,其余一律报错。

第二个就好理解了:<? super Aliphatic>,这个类型一定是Aliphatic本身,或它的父类。但是不管这个父类是谁,它一定能兼容Aliphatic及其子类,但不能保证兼容Organic(有可能是其他intrerface)。还是那句话,编译器是很懒的。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,