刚做了一道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 到底是什么类型. 不知我说的对不?
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 到底是什么类型. 不知我说的对不?
解决方案 »
- 处理大批量数据需同步问题
- 求一函数:16进制IP字符串转 正常IP字符串
- 怎麼解釋啊?
- 用PB写C/S结构的信息系统5年多了,现在想转到Java写B/S结构的信息系统了,不知道该从什么开始?
- !!!!!都!!!!!来!!!!!看!!!!!啊!!!!!!-------我都受不啦!!!!!
- 在java中怎么调用执行一个exe文件啊?
- java多线程
- 为什么用javac不能编译HelloWorld.java?提示说javac不是内部命令!
- 哪里有sun one studio 4的下载??
- 新手求助。String创建了几个对象
- Reference Handler 优先级为10 ,这么高的优先级是什么线程,启动用来做什么?
- 【求助】java构造一个复数类
对于B:double x = (t.findLarger(123, new Double(456))).doubleValue();就对了
对于D也是同理吧
不是吧,如果是编译器看作是Object类型,那么这个T 根本不满足这个方法中类型变量T的要求阿,因为Object中并是extends Comparable 阿
照这样看。。那么所有的整数,字符串,浮点数,随便取2个作为参数传递进去的话,都能通过编译?(如果忽视等号左边的那个变量),那岂不是乱套了??整数和字符串 等等这些东西随便拿出2个都是可以有偏序关系的么?
就是说,是不是任意拿出1整数,1字符串,1浮点数,他们都可以用compareTo 来彼此之间进行比较?我还是不太明白。
只是能通过编译,执行到第3行的时候会抛出运行时异常,因为无法将String转换为int。
那么是不是说,对于这个代码
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个参数,(任意参数),都能通过编译??假设忽视调用时等号左边的变量类型?
public <T extends Comparable> T findLarger(T x, T y)
就变成了
public java.lang.Comparable findLarger(java.lang.Comparable, java.lang.Comparable);
编译时不出现错误,运行时调用compareTo方法时会出现问题。