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

帮我看看这道题,急求答案,解释。

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));  --------------------编程问答-------------------- B C ,t.findLarger返回的是一个对象类型数据,B C 中为int型,错误。 --------------------编程问答-------------------- 可是答案是A,C 啊 --------------------编程问答-------------------- 恩,答案是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());你觉得对不对? --------------------编程问答-------------------- 试下我有没有被锁号 --------------------编程问答-------------------- 考研 就业 给意见 --------------------编程问答-------------------- 经验 ??????? --------------------编程问答--------------------  public <T extends Comparable> T findLarger(T x, T y)

A——T == object
C——T == int

故选 AC

B:456 为Double封装类,而T为int类型,错
D:t.findLarger(new Double(123), new Double(456)) 返回  double 类型 ,不可转int类型,错
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,