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 啊..可以解释下么..

解决方案 »

  1.   

    应该是a d吧,c怎么可以??
      

  2.   

    泛型,自动装箱
    ===============
    那么对于A来说怎么对呢?123装箱以后是Integer,“456" 装箱以后是String啊...
    而public <T extends Comparable> T findLarger(T x, T y)要求参数的类型是一样的啊...
    ???????
      

  3.   

    这个题有意思!上机试了一下,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,所以会报错。
    以上是个人的看法,大家随便点评下。
      

  4.   

    A编译通过是正常的。因为任何返回类型都可转为Object。
      

  5.   

    public <T extends Comparable> T findLarger(T x, T y)
    不是要求x和 y的类型要一样的啊...
    现在对于A来说x是Integer ,y是String,怎么可以??
      

  6.   

    public <T extends Comparable> T findLarger(T x, T y) {
    ==>我们这么理解吧,首先,定义了T,为Comparable Object,然后定义了一个返回值为T的方法,这个方法的两个参数都是T类型的。没有异议吧?==>关于下面这几个选项,考察的还有Autoboxing, WiddeningA. 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));
    ==>不用说了吧?
      

  7.   

    先Autobox再Widden行,先Widden再Autobox不行。
    int ==> Integer ==> Number ,这个可以。
    byte ==> long ==> Long,这种是不行的。
      

  8.   

    编译时,编译器发现B、D中调用findLarger时返回的可能是Double(因为用了T来约束参数和返回值),转不到int,所以会报错。
    ====================================
    好像Double  x  =  t.findLarger(123,  new  Double(456));也是错的
    呵呵。还是z_lping(Schemer)合理点。。
      

  9.   

    你这些稀奇古怪的问题从哪里找来的?你要考SCJP呀?要考100呀?
      

  10.   

    你这些稀奇古怪的问题从哪里找来的?你要考SCJP呀?要考100呀?
    ===========================================================
    呵呵,这些都是基础的题目阿。。
    通过题目可以发现自己的不足啊。。然后解决问题,,这是一种过程。。呵呵
    不过我的很多问题都是你解决的。。先谢谢你了阿。。
      

  11.   

    上机调试一下就知道了,其实4个答案都能编译通过
    只有C,D可以正确运行题目指定了泛型 <T extends Comparable>
    Integer, Double, String 都实现了Comparable接口,因此都可以作为方法的合法参数A 相当于 findInteger( (Comparable)(Integer.valueOf(123), (Comparable)"456");
    B 相当于 findInteger( (Comparable)(Integer.valueOf(123), (Comparable)(Double.valueOf(456));
    以此类推,都能编译通过运行时A相当于x.compareTo((Integer)y) 因为y是String,这里转型失败
    B相当于x.compareTo((Integer)y),y是Double,这里转型失败