@Test
public void test() {
MyProperties props = new MyProperties();
props.setProperty("value", new Date());
StringUtils.isNullOrEmpty(props.getProperty("value"));
}
public class MyProperties {
private Map<String, Object> properties = new HashMap<String, Object>();
public void setProperty(String name, Object value) {
properties.put(name, value);
}
@SuppressWarnings("unchecked")
public <T> T getProperty(String name) {
return (T) properties.get(name);
}
}
public class StringUtils {
public static boolean isNullOrEmpty(Object string) {
return isNullOrEmpty(valueOf(string));
}
public static String valueOf(Object string) {
if (string == null) {
return "";
}
return string.toString();
}
public static boolean isNullOrEmpty(String string) {
if (string == null || string.length() == 0) {
return false;
}
int strLength = string.length();
for (int i = 0; i < strLength; i++) {
char charAt = string.charAt(i);
if (charAt > ' ') {
return true;
}
}
return false;
}
}
वर्षों से, यह यूनिट परीक्षण पास हो रहा है। फिर जावा 8 में अपग्रेड करने के बाद, कुछ वातावरण में, जब कोड जावैक के माध्यम से संकलित किया जाता है, तो यह स्ट्रिंगयूटिलसिस नलऑरिएक्टी (स्ट्रिंग) ओवरलोड चुनता है।जावा कंपाइलर गलत अधिभार चुनने
java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String at com.foo.bar.StringUtils_UT.test(StringUtils_UT.java:35)
इकाई परीक्षण जब संकलित और चींटी के माध्यम से मेरी मशीन पर चलने पास (चींटी 1.9.6, jdk_8_u60, विंडोज 7 64 बिट), लेकिन पर विफल रहता है: यह निम्न त्रुटि संदेश के साथ विफल इकाई परीक्षण का कारण बनता है एक और चींटी और जावा के समान संस्करण (चींटी 1.9.6 jdk_8_u60, उबंटू 12.04.4 32 बिट) के साथ।
जावा का type inference, जो संकलन करते समय सभी लागू ओवरलोड से सबसे विशिष्ट ओवरलोड चुनता है, जावा 8 में बदल दिया गया है। मुझे लगता है कि मेरे मुद्दे के साथ कुछ करने के लिए कुछ है।
मुझे पता है कि कंपाइलर MyProperties.getProperty (...) विधि के वापसी प्रकार को टी के रूप में नहीं देखता है। चूंकि संकलक getProperty (...) विधि के रिटर्न प्रकार को नहीं जानता है, इसलिए यह StringUtils.isNullorEmpty (ऑब्जेक्ट) के बजाय StringUtils.isNullorEmpty (स्ट्रिंग) क्यों चुन रहा है - जो हमेशा काम करना चाहिए?
क्या यह जावा में एक बग है या जावा 8 के प्रकार अनुमान के परिणाम का परिणाम है? इसके अलावा, जावा के समान संस्करण का उपयोग करने वाले विभिन्न वातावरण इस कोड को अलग-अलग संकलित क्यों करेंगे?
अपने मामले सभी जावा-8 JREs 'StringUtils.isNullOrEmpty (स्ट्रिंग) का चयन करना चाहिए' अधिभार केवल .. चेक [इस अतः] (http://stackoverflow.com/questions/30521974/why-does में -ज-जावा -8-जेनेरिक-टाइप-इनफरेंस-पिक-इट-ओवरलोड) जो इस मामले में किस ओवरलोड को चुना जाएगा ... – Codebender
ईमानदार 'getProperty' होने के लिए मुझे एक बुरा मजाक लग रहा है। हालांकि यह जावा 8 में एक समस्या की तरह दिखता है, यह अच्छा है कि अब आप उस सुगंधित कोड पर कुछ ध्यान दें। चूंकि आप 'ऑब्जेक्ट' को छोड़कर * मूल्य * के लिए किसी भी अन्य प्रकार का उपयोग नहीं कर रहे हैं, 'टी' ऑब्जेक्ट' से कुछ और नहीं हो सकता है। क्या आप व्याख्या कर सकते हैं कि आप 'टी' के साथ क्या जादू होने की उम्मीद करते हैं? यदि नहीं, तो इसे हटा दें और 'Properties.get (name)' को 'ऑब्जेक्ट' के रूप में वापस करें। एक चेतावनी को अनदेखा करना बीटीडब्ल्यू शायद ही कभी एक अच्छा विचार है :)। – Tom
हाँ, आपका कोड सभी के साथ टूट गया है, लेकिन यह काम करने के लिए _happened_ है। अब यह वापसी का समय है। –