一道小题目,大家看看..
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会运行时抛出
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,所以会报错。
以上是个人的看法,大家随便点评下。
------解决方案--------------------public <T extends Comparable> T findLarger(T x, T y) {
==> 我们这么理解吧,首先,定义了T,为Comparable Object,然后定义了一个返回值为T的方法,这个方法的两个参数都是T类型的。没有异议吧?
==> 关于下面这几个选项,考察的还有Autoboxing, Widdening
A. 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));
==> 不用说了吧?