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)); 

解决方案 »

  1.   

    B C ,t.findLarger返回的是一个对象类型数据,B C 中为int型,错误。
      

  2.   

    恩,答案是A,C,说一下我个人的理解,共同学习吧。
    <T extends Comparable>是jdk5的新特性,叫泛型通配符,public <T extends Comparable> T findLarger(T x, T y),这个函数声明中要求入参为T,即入参必须实现Comparable接口,并且最终能转化成同种类型,现在来分析选项.
    A. Object x = t.findLarger(123, “456”);  
    123是int类型的,自动打包成Integer类型的,所以相当于实现了Comparable接口,“456”是string类型的,也相当于实现了Comparable接口,两个入参要求类型相同,所以会进行类型擦除,最终两个参数都转换成为了Object类型,所以入参是满足条件的,比较结果也是Object类型的(虽然不能比较成功),所以A正确。
    B. int x = t.findLarger(123, new Double(456));  
    入参分析同A,最终经过类型擦除,最终两个参数都转换成为了Number类型,把Number类型赋给int会出现编译器错误,所以B不正确。
    C. int x = t.findLarger(123, new Integer(456)); 
    入参分析同A,入参类型一致,所以不会出现类型擦除,比较结果为Integer,赋给int类型没有任何问题,正确
    D. int x = (int) t.findLarger(new Double(123), new Double(456)); 
    入参分析同A,入参类型一致,所以不会出现类型擦除,比较结果为Double,不能强制转换成Int型(double转int应该为Integer.parseDoube(double d)),所以错误。所以关键点有两个,一个是泛型通配符,另一个是类型擦除。多思考一点:
    再定义两个类:
    class Person implements Comparable{
    public int compareTo(Object o) {
    return 0;
    }
    }class Student implements Comparable {
    public int compareTo(Object o) {
    return 0;
    }
    }E:Object o = t.findLarger(new Person(), new Student());你觉得对不对?
      

  3.   

     public <T extends Comparable> T findLarger(T x, T y)A——T == object
    C——T == int故选 ACB:456 为Double封装类,而T为int类型,错
    D:t.findLarger(new Double(123), new Double(456)) 返回  double 类型 ,不可转int类型,错