帮我看看这道题,急求答案,解释。
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