2011-05-24 71 views
0

当我在eclipse中通过编译器合规性级别6.0编译此代码时,它编译正常,但是当我更改编译器级别4.0时,此代码显示错误,即不兼容条件操作数类型String和Integer。这是什么问题,并改变了这种代码需要得到同样的结果使用java版本4.0编译

Calendar cal = Calendar.getInstance(); 
String timeStr = (calendar.get(Calendar.HOUR_OF_DAY) < 10 ?  
    "0" + Integer.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) :  
    Integer.valueOf(calendar.get(Calendar.HOUR_OF_DAY))) + ":" + 
     (calendar.get(Calendar.MINUTE) < 10 ? 
     "0" + Integer.valueOf(calendar.get(Calendar.MINUTE)) : 
     Integer.valueOf(calendar.get(Calendar.MINUTE))); 
+0

它只是因为追加0,如果我们是小于10 – 2011-05-24 05:45:12

+0

考虑第一小时和分钟拉出到变量? – 2011-05-24 05:57:30

回答

1

为什么不直接使用SimpleDateFormat得到相同的结果,就像这样:

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
String timeStr = sdf.format(cal.getTime()); 

它与编译器合规水平集到1.4。

编辑:供参考,如果SimpleDateFormat不存在,我建议你写它是这样的:

int hour = calendar.get(Calendar.HOUR_OF_DAY); 
int minute = calendar.get(Calendar.MINUTE); 
String timeStr = (hour < 10 ? "0" : "") + hour + ":" 
     + (minute < 10 ? "0" : "") + minute; 
+0

是的,你是对的,它给出了我需要的结果。谢谢 – 2011-05-24 05:50:41

2

的问题是,如果HOUR_OF_DAY是< 10,条件运算符将评估为一个字符串,如果不是,它将评估为一个整数。在4.0,这被认为是一个错误(因为编译器有益指出。)

为了解决这个问题,你应该只使用一个内置的日期格式化,而不是复杂的逻辑并不总是编译。例如:

SimpleDateFormat dateFormatter = new SimpleDateFormat("HH:mm"); 
String theCurrentTime = dateFormatter.format(cal.getTime()); 

如果你真的需要保留的逻辑,不过,你可以通过把"" +Integer.valueOf()呼叫前在有条件的经营者的:分支修复它。虽然不是最好的选择。

0

大多数人类程序员可能会被你的代码弄糊涂;我猜测编译器也是。 :-)

稍好的风格,但没有直接回答你的问题应该是:

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); 
String timeStr = sdf.format(cal); 
0

快速修复:添加一些空字符串(如果你想保持你的代码):

String timeStr = 
    (calendar.get(Calendar.HOUR_OF_DAY) < 10 ?  
     "0" + Integer.valueOf(calendar.get(Calendar.HOUR_OF_DAY)) :  
     "" + Integer.valueOf(calendar.get(Calendar.HOUR_OF_DAY))) 
    + ":" + 
    (calendar.get(Calendar.MINUTE) < 10 ? 
     "0" + Integer.valueOf(calendar.get(Calendar.MINUTE)) : 
     "" + Integer.valueOf(calendar.get(Calendar.MINUTE))); 

(但我也推荐简单的格式化程序 - 你有很多可避免的隐藏转换,从String到Integer到int并返回String)

1

真正的问题是那些Integer.valueOf(...)调用将int值转换为Integer对象。这没有做任何有用的事情。当编译器级别为4.0时,会出现编译错误,因为Java 1.4.x不支持拆箱,因此三元运算符的操作数不兼容。

如果我们剔除了Integer.valueOf东西,它看起来像这样:

String timeStr = 
    (calendar.get(Calendar.HOUR_OF_DAY) < 10 ?  
     "0" + calendar.get(Calendar.HOUR_OF_DAY) :  
     calendar.get(Calendar.HOUR_OF_DAY)) + 
    ":" + 
    (calendar.get(Calendar.MINUTE) < 10 ? 
     "0" + calendar.get(Calendar.MINUTE) : 
     calendar.get(Calendar.MINUTE)); 

这仍然不能编译,因为该类型的第二和三元运算符的第三个操作数不匹配。这是很容易解决:

String timeStr = 
    (calendar.get(Calendar.HOUR_OF_DAY) < 10 ?  
     "0" + calendar.get(Calendar.HOUR_OF_DAY) :  
     "" + calendar.get(Calendar.HOUR_OF_DAY)) + 
    ":" + 
    (calendar.get(Calendar.MINUTE) < 10 ? 
     "0" + calendar.get(Calendar.MINUTE) : 
     "" + calendar.get(Calendar.MINUTE)); 

(编译器可能会优化掉的串联与"" ...)

最后,你可以重构它进一步把这个:

int hours = calendar.get(Calendar.HOUR_OF_DAY); 
int minutes = calendar.get(Calendar.MINUTE); 
String timeStr = 
     (hours < 10 ? "0" : "") + hours + ":" + 
     (minutes < 10 ? "0" : "") + minutes;