2012-01-19 21 views
7

के साथ इस तरह के प्रश्नों का एक समूह नहीं है। मैं उनमें से ज्यादातर के माध्यम से चला गया लेकिन वास्तव में कोई भी नहीं, लेकिन मैं किसी भी उत्तर के साथ नहीं आ सकता:यह कोड ग्रहण कंपाइलर के साथ क्यों संकलित करता है लेकिन javac (maven)

मुझे अपने जीडब्ल्यूटी/जीडब्ल्यूटी कक्षाओं में से एक में एक अजीब समस्या है।
वर्ग ग्रहण कंपाइलर के साथ ठीक संकलित करता है लेकिन जावैक कंपाइलर (मेवेन) के साथ विफल रहता है।

//additional imports 
import com.gwtplatform.mvp.client.PresenterWidget; 
import com.gwtplatform.mvp.client.View; 

public class MyPresenter extends PresenterWidget<MyPresenter.MyView> { 

    public interface MyView extends View { 


    } 

    some code 
} 

जब मैं मैं त्रुटि निम्न मिल Maven के साथ संकलित करने के लिए प्रयास करें:

cannot find symbol symbol: class View

देखेंcom.gwtplatform.mvp.client पैकेज में View इंटरफेस को दर्शाता है।

मेरे पास अन्य वर्ग हैं जो समान दिखते हैं और ठीक काम करते हैं।
अजीब बात यह है कि अगर मैं आयात के आदेश को बदलता हूं या मैं View इंटरफ़ेस का सटीक पैकेज निर्दिष्ट करता हूं तो यह मैवेन में किसी भी समस्या के बिना संकलित करता है।
विशिष्ट होना करने के लिए मैं com.gwtplatform.mvp.client.View

import com.gwtplatform.mvp.client.View; 
//additional imports 
import com.gwtplatform.mvp.client.PresenterWidget; 

के लिए आयात चले गए मैं वर्ग है जो इनर क्लासों का उल्लेख (ग्रहण में काम किया लेकिन javac में नहीं था) के बीच चक्रीय विरासत समस्या के साथ कुछ समय पहले एक ऐसी ही समस्या थी। हालांकि मुझे यकीन नहीं है कि यह वही समस्या है।

+1

आपकी समस्याओं के मूल कारण पर निश्चित नहीं है, लेकिन आंतरिक इंटरफेस बहुत सुंदर नहीं हैं और इससे आपकी निर्भरताएं कहां से आ रही हैं, इस बारे में भ्रम पैदा हो सकता है। – AndyT

+0

आप सही हैं और मुझे लगता है कि कक्षा से इंटरफ़ेस को स्थानांतरित करना इसे ठीक करेगा (कठिन मैंने इसे सत्यापित नहीं किया है)। मैं सिर्फ उत्सुक था कि इस अजीब व्यवहार के लिए स्पष्टीकरण क्या हो सकता है (आयात के चारों ओर घूमने से कोड संकलित हो जाता है या नहीं) –

उत्तर

8

ग्रहण कंपाइलर वास्तव में जावैक कंपाइलर की तुलना में एक अलग संकलक है। कभी-कभी वे व्यवहार में अलग हो जाते हैं, आमतौर पर वे जल्दी से मेल खाते हैं।

जावा के जेनेरिक होने पर यह बहुत ही उल्लेखनीय था। ऐसे मामले थे जहां ग्रहण को या तो जेनेरिक निर्देश के साथ गलती मिली थी कि जावैक जेनिक्स के साथ गलती पायेगा या जेवाक जेनिक्स के साथ गलती पायेगा जो ग्रहण करेगा (याद नहीं रख सकता कि यह कितना समय पहले अलग हो गया था)। किसी भी मामले में, जावैक सही कार्यान्वयन होने की अधिक संभावना है।

अपने मामले में, आप अपने जेनेरिक संदर्भ के साथ एक आंतरिक वर्ग के संदर्भ में नामस्थान को प्रदूषित करते हैं। बाधाएं हैं कि ग्रहण जावैक की तुलना में एक अलग प्राथमिकता क्रम में "दृश्य" के लिए पहुंच रहा है। बाधाएं उत्कृष्ट हैं कि या तो जावा ने जावा भाषा दिशानिर्देशों में निर्दिष्ट आदेश को लागू किया है, या जावा दिशानिर्देशों ने अभी तक विरोधाभासी समान नामित वर्गों को हल करने के "एक सही आदेश" का उच्चारण नहीं किया है। आम तौर पर यह कोई समस्या नहीं है क्योंकि जावा में दो बार एक ही गैर-पूर्ण-योग्य नाम का उपयोग करने की अनुमति नहीं है; हालांकि, आंतरिक वर्गों के साथ विनिर्देशों का प्रकार "आसपास काम किया जा सकता है"।

मैं सिर्फ एक दृश्य तक

public interface MyView extends View { 


} 

बाँध कर (पता नहीं है अगर com.gwtplatform.mvp.client.View या MyPresenter.View सही एक है) नाम स्पष्ट बनाकर होगा।

public interface MyView extends MyPresenter.View { 


} 

या

public interface MyView extends com.gwtplatform.mvp.client.View { 


} 

इस तरह आप शिकार गिर नहीं है इंटरफ़ेस एक संकलक निर्भर तरीके से गलत प्रकार के लिए "बाइंडिंग" करने के लिए।

+0

वाह। मैं जावा प्रोजेक्ट के रूपांतरण के दौरान 'कुछ भी नहीं-हिट-कंपाइल-इन-एक्लिप्स' से मैवेन के रूपांतरण के दौरान इस मुद्दे पर फंस गया। जावा कंपाइलर एक लापता प्रतीक के बारे में शिकायत करता है जो गुम नहीं है, इसलिए इस समस्या का कारण खोजना मुश्किल है। अंदरूनी-आंतरिक कक्षाओं को आंतरिक वर्ग के भीतर आंतरिक के रूप में संदर्भित करना। आंतरिक काम करता है, लेकिन बाहरी के लिए आयात के साथ आंतरिक। इंटर्न.इनर केवल ग्रहण में काम करता है, मैवेन से नहीं। धन्यवाद! – JeroenHoek

संबंधित मुद्दे