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 啊..可以解释下么..
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来说怎么对呢?123装箱以后是Integer,“456" 装箱以后是String啊...
而public <T extends Comparable> T findLarger(T x, T y)要求参数的类型是一样的啊...
???????
下面解释下为什么B,D不行。在java中,只有Integer可以直接这样转int:
int i=new Integer(2);//其他象Double/String都不行。
编译时,编译器发现B、D中调用findLarger时返回的可能是Double(因为用了T来约束参数和返回值),转不到int,所以会报错。
以上是个人的看法,大家随便点评下。
不是要求x和 y的类型要一样的啊...
现在对于A来说x是Integer ,y是String,怎么可以??
==>我们这么理解吧,首先,定义了T,为Comparable Object,然后定义了一个返回值为T的方法,这个方法的两个参数都是T类型的。没有异议吧?==>关于下面这几个选项,考察的还有Autoboxing, WiddeningA. 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));
==>不用说了吧?
int ==> Integer ==> Number ,这个可以。
byte ==> long ==> Long,这种是不行的。
====================================
好像Double x = t.findLarger(123, new Double(456));也是错的
呵呵。还是z_lping(Schemer)合理点。。
===========================================================
呵呵,这些都是基础的题目阿。。
通过题目可以发现自己的不足啊。。然后解决问题,,这是一种过程。。呵呵
不过我的很多问题都是你解决的。。先谢谢你了阿。。
只有C,D可以正确运行题目指定了泛型 <T extends Comparable>
Integer, Double, String 都实现了Comparable接口,因此都可以作为方法的合法参数A 相当于 findInteger( (Comparable)(Integer.valueOf(123), (Comparable)"456");
B 相当于 findInteger( (Comparable)(Integer.valueOf(123), (Comparable)(Double.valueOf(456));
以此类推,都能编译通过运行时A相当于x.compareTo((Integer)y) 因为y是String,这里转型失败
B相当于x.compareTo((Integer)y),y是Double,这里转型失败