刚做了一道SCJP题目,感觉答案没道理,特来求教Question 181
Given:
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选项是错误的编译器虽然会进行智能推断,它看第一个参数是认为T是 Integer型,它看第2个参数时会认为T 是 String型,所以编译器可能会犯糊涂从而得不到统一的T 到底是什么类型. 不知我说的对不?

解决方案 »

  1.   

    对于t.findLarger(123, "456"),T表示的是123和"456"这两个参数所属类型,即Integer类和String类的公共祖先————Comparable接口。而将Comparable对象赋值给Object变量是合法的,因此可以通过编译。如果将这句改成Integer x = t.findLarger(123, "456");就会发生编译错误了。
      

  2.   

    这是哪的题啊完全不明白啊,public <T extends Comparable> T findLarger(T x, T y)怎么<T extends Comparable>写在返回类型T的前面了,高手来详细说说吧
      

  3.   

    Double 也实现了comparable接口
    对于B:double x = (t.findLarger(123, new Double(456))).doubleValue();就对了
    对于D也是同理吧
      

  4.   


    不是吧,如果是编译器看作是Object类型,那么这个T 根本不满足这个方法中类型变量T的要求阿,因为Object中并是extends Comparable 阿
      

  5.   


    照这样看。。那么所有的整数,字符串,浮点数,随便取2个作为参数传递进去的话,都能通过编译?(如果忽视等号左边的那个变量),那岂不是乱套了??整数和字符串 等等这些东西随便拿出2个都是可以有偏序关系的么?
     就是说,是不是任意拿出1整数,1字符串,1浮点数,他们都可以用compareTo 来彼此之间进行比较?我还是不太明白。
      

  6.   


    只是能通过编译,执行到第3行的时候会抛出运行时异常,因为无法将String转换为int。
      

  7.   


    那么是不是说,对于这个代码
    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. } 在任何情况下直接调用这个方法,并且给出2个参数,(任意参数),都能通过编译??假设忽视调用时等号左边的变量类型?
      

  8.   

    编译器编译的时候只要两个参数满足T extends Comparable就可以了。没有作其他的检查。
      

  9.   

    类型擦除之后代码
    public <T extends Comparable> T findLarger(T x, T y) 
    就变成了
    public java.lang.Comparable findLarger(java.lang.Comparable, java.lang.Comparable);
      

  10.   

    1楼的解释是正确的
    编译时不出现错误,运行时调用compareTo方法时会出现问题。