के आसपास अजीब व्यवहार मैंने हाल ही में कोड के एक टुकड़े पर ठोकर खाई जो "ग्रहण" मुद्दे के कारण मेरे ग्रहण में संकलित नहीं होगा (this one के समान दिखता है)। कोड लिखने वाले लोगों ने मुझे आश्वासन दिया कि यह उनके स्थानीय पर्यावरण और उनके निरंतर एकीकरण में संकलित है और इसलिए मैंने इसे अनुकरण करने के लिए खेला। कार्यक्षेत्र डिफ़ॉल्ट के रूप में संकलित नहीं होगा और शिकायत करेगा कि विधि DoSomething (संग्रह) एक ही विलोपन DoSomething (संग्रह) है"समान मिटा" संकलन त्रुटि
package com.mycompany.playground;
import java.util.ArrayList;
import java.util.Collection;
public class GenericsTest {
public static void main (String[] args) {
System.out.println(GenericsTest.doSomething(new ArrayList<A>()));
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
}
public GenericsTest() {
}
public static String doSomething(Collection<A> listOfA) {
return "has done something to Collection<A>";
}
public static Integer doSomething(Collection<C> listOfC) {
return 0;
}
private class A {
}
private class C {
}
}
ग्रहण 1.6.0_21 JDK साथ Helios के रूप में:
इस स्निपेट पर एक नजर डालें जेनेरिकटेस्ट प्रकार में एक और तरीका। यह दूसरी विधि के बारे में भी यही कहेंगे।
ग्रहण को चलाने के लिए मजबूर करने की कोशिश की और देखा: धागे "मुख्य" java.lang.Error में अपवाद: अनसुलझा संकलन समस्या: विधि जेनरिक्सटेस्ट प्रकार में कुछ (संग्रह) तर्क (ArrayList) के लिए लागू नहीं है।
ठीक है। इसकी उम्मीद थी। अभी व। अगर मैं अपनी कमांड लाइन में जाता हूं और सरल चलाता हूं:
javac GenericsTest.java
यह संकलित करता है। मैंने 1.6.0_21 और 1.6.0_06 (जिन लोगों के पास उनके वातावरण में था) की जांच की और न ही शिकायत की। मैंने क्लास फाइलों की प्रतिलिपि बनाई जहां एक्लिप्स ने उन्हें उम्मीद की और इसे फिर से चलाने के लिए मजबूर किया।
यह प्रिंट:
has done something to Collection<A>
true
अगर मैं बदलने के साथ
System.out.println(0 == GenericsTest.doSomething(new ArrayList<C>()));
System.out.println(GenericsTest.doSomething(new ArrayList<C>()));
यह अभी भी कमांड लाइन से बिना चेतावनी के संकलन, लेकिन एक ही "समाधान नहीं किया गया संकलन देना होगा समस्या "इसे चलाने की कोशिश करते समय।
यहां दो प्रश्न।
क्या जावा ने बस अंतर्निहित ग्रहण कंपाइलर को बाहर निकाला था? लगभग this previously asked question की तरह दिखता है, इसलिए मुझे विश्वास है कि मुझे जवाब पता है। (वैसे, मैं ग्रहण को javac का उपयोग करने के लिए कैसे कह सकता हूं?)।
क्यों javac चुपचाप संकलन होगा जावा तो साथ {0 ==} "संकेत" हटा चलाने के लिए असफल हो जायेगी (दूसरे परिदृश्य?
ग्रहण कंपाइलर सही है, सूर्य 'जावैक' गलत है। जावा भाषा विशिष्टता ऐसा कहती है। विशेष रूप से, [धारा 8.1.2 जेनेरिक क्लासेस और टाइप पैरामीटर] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.2) इसमें एक सामान्य प्रकार क्या है और [ 8.4.2 विधि हस्ताक्षर] (http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.4.2) क्या हस्ताक्षर संकलित-समय त्रुटियों का कारण बनेंगे। – Powerlord