日期:2014-05-20  浏览次数:20644 次

一道小题目,大家看看..
1.   public   class   Test   {
2.   public   <T   extends   Comparable>   T   findLarger(T   x,   T   y)   {
3.   if(x.compareTo(y)   >   0)   {
4.   return   x;
5.   }   else   {
6.   return   y;
7.   }
8.   }
9.   }
and:
22.   Test   t   =   new   Test();
23.   //   insert   code   here
Which   two   will   compile   without   errors   when   inserted   at   line   23?
(Choose   two.)
A.   Object   x   =   t.findLarger(123,   “456”);
B.   int   x   =   t.findLarger(123,   new   Double(456));
C.   int   x   =   t.findLarger(123,   new   Integer(456));
D.   int   x   =   (int)   t.findLarger(new   Double(123),   new   Double(456));

答案怎么是AC 啊..可以解释下么..

------解决方案--------------------
这个题有意思!上机试了一下,A会运行时抛出ClassCastException,因为Integer的compareTo函数只接受Integer型参数,而从String 转不到Integer.接受返回值的x是Object型,所以结果可以向上转型。
下面解释下为什么B,D不行。在java中,只有Integer可以直接这样转int:
int i=new Integer(2);//其他象Double/String都不行。
编译时,编译器发现B、D中调用findLarger时返回的可能是Double(因为用了T来约束参数和返回值),转不到int,所以会报错。
以上是个人的看法,大家随便点评下。
------解决方案--------------------
public <T extends Comparable> T findLarger(T x, T y) {
==> 我们这么理解吧,首先,定义了T,为Comparable Object,然后定义了一个返回值为T的方法,这个方法的两个参数都是T类型的。没有异议吧?

==> 关于下面这几个选项,考察的还有Autoboxing, Widdening

A. Object x = t.findLarger(123, “456”);
==> 这里,期待的返回值是Object,或者说T应该是Object就好了,那么,123和 "456 "都满足作为Object的条件,当然啦,123会先Autobox成Integer,然后Widden成Object。编译没有问题。
==> 运行的时候,可就有问题了,这个就不用多说了。但是这个题目问的是编译,呵呵。

B. int x = t.findLarger(123, new Double(456));
==> 这里呢,期待Integer,或者说T是Integer,自然那个new Double(456)不满足条件啊,编译不过。

C. int x = t.findLarger(123, new Integer(456));
==> 不用说了吧?

D. int x = (int) t.findLarger(new Double(123), new Double(456));
==> 不用说了吧?