2011-11-14 6 views
9

से अपरिवर्तनीय प्रकार मेरे पास जेनिक्स का उपयोग करके कुछ गिइस बाइंडिंग कोड है जो एक्लिप्स के कंपाइलर से ठीक से काम करता है और काम करता है, लेकिन जावा (कमांड लाइन) कंपाइलर से नहीं। मैंने नवीनतम (1.7.0_01) जावा एसडीके में अपग्रेड किया लेकिन फिर भी निम्न त्रुटि प्राप्त हुई।जावा जेनरिक त्रुटि: कमांड लाइन कंपाइलर

[error] ...\BindCategorySelectorActivity.java:42: error: inconvertible types 
[error]         (Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>) CategoryDataProvider.class); 
[error]                               ^
[error] required: Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>> 
[error] found: Class<CategoryDataProvider> 
[error] 1 error 
[error] {file:/.../compile:compile: javac returned nonzero exit code 

प्रासंगिक कोड:

public interface Category extends DatabaseItem {} 
public class CategoryDataProvider implements 
ListAdapterDataProvider<Row<Category>> {} 
public class BindListViewHandlerWithSpecificProvider extends AbstractModule { 
    public BindListViewHandlerWithSpecificProvider(
    Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>> 
     dataProviderClass) {} 
} 

@SuppressWarnings("unchecked") 
// Error happens here: 
final BindListViewHandlerWithSpecificProvider 
bindListViewHandlerWithSpecificProvider = 
    new BindListViewHandlerWithSpecificProvider(
    (Class<? extends ListAdapterDataProvider<Row<? extends DatabaseItem>>>) 
    CategoryDataProvider.class); 

उत्तर

6

खुद पर एक एहसान करो और एक Upcast एक खिन्न के बाद कार्य करें:

Class<...> foo = (Class<...>)(Object)MyClass.class; 

मुद्दा यह है कि CDP.class प्रकार Class<CDP>, CDP की है एक जा रहा है कच्चा प्रकार जबकि एक पैरामीटरकृत प्रकार C<T1,...,Tn> कच्चे प्रकार C (§4.10.2) का उप प्रकार है, उलटा सच नहीं है: CC<T1,...,Tn> का उप-प्रकार नहीं है। अनचेक रूपांतरण (§5.1.9) के कारण यह केवल सच साबित होता है। यह आपकी समस्या का कारण बन रहा है: आप CDP को "विस्तार" (Class<? extends ...> की ऊपरी सीमा में) LADP<Row<? extends DI>> पर उम्मीद करते हैं। यह मामला नहीं है क्योंकि टाइप तर्क रोकथाम (§4.5.1.1) उप-टाइपिंग पर परिभाषित किया गया है और अनचेक रूपांतरण पर विचार नहीं करता है।

(या पीछा करने में कटौती के लिए: javac इस एक का अधिकार मिल गया है।)

+0

खैर वापस रख, यह संकलन करने में कामयाब रहे, लेकिन मैं अगर यकीन नहीं है ऑब्जेक्ट में अतिरिक्त कलाकार डालने से समस्या को हल किया गया। बांधने की कोशिश करते समय गिस एक नल सूचक अपवाद के साथ दुर्घटनाग्रस्त हो जाता है। जिस लाइन की इसकी रिपोर्टिंग 'bindListViewHandlerWithSpecificProvider' तक पहुंच रही है। और याद रखें, ग्रहण के भीतर बनाए गए त्रुटि के बिना यह समान कोड संकलित और निष्पादित करता है। –

+1

मैं उस उत्सुक व्यवहार को स्वीकार करूंगा। ऑब्जेक्ट में अतिरिक्त कलाकार डालने से 'साइडकास्टिंग' से जावैक को छेड़छाड़ करने से परे कुछ भी नहीं होता है। आप _should_ प्रभावी ढंग से एक ही कार्यक्रम के साथ खत्म हो। –

+0

क्या आप जेनिक्स के लिए गुइस के अतिरिक्त समर्थन से परिचित हैं और यदि पैरामीटरयुक्त प्रकारों को पारित करने के लिए बेहतर तंत्र होगा? कोई विचार अगर स्कैला पैरामीटरयुक्त प्रकारों को पारित करने के लिए बेहतर समर्थन प्रदान करता है? –

1

मैं जानता हूँ कि इस सवाल का जवाब काम कर रहा है और स्वीकार किए जाते हैं, लेकिन मेरा मानना ​​है कि खिन्न सही समाधान नहीं है। इसके अलावा मेरा कोड क्लीनअप अप्रचलित नीचे कास्ट हटा देता है ...

1) कारण ग्रहण और कमांड लाइन ग्रहण सेटिंग्स की वजह से एक ही समस्या उत्पन्न नहीं करती है। वरीयताओं पर जाएं - जावा - कंपाइलर - त्रुटियां/चेतावनी और चेतावनी के लिए सामान्य प्रकार (अनचेक जेनेरिक प्रकार ऑपरेशन) सेट करें। फिर यदि आप @SuppressWarnings("unchecked")

2) को हटा दें तो एक ही समस्या का पता लगाएगा और एक दोस्त मुझे एक और समाधान दिखाता है। (नीचे डाली बिना) ठीक से कोड को ठीक करने के लिए सिर्फ इस CategoryDataProvider.class बदलने के लिए:

new CategoryDataProvider<Row<DatabaseItem>>().getClass() 

फिर @SuppressWarnings("unchecked")

+0

यह विधि केवल तभी काम कर सकती है जब कक्षा (इस मामले में, श्रेणीडेटाप्रोवाइडर) में एक डिफ़ॉल्ट कन्स्ट्रक्टर है। अधिक जटिल मामलों में, कक्षा को पुनर्प्राप्त करने के लिए, इस विधि के लिए आपको बड़ी तैयारी और प्रारंभिक कार्य करने की आवश्यकता हो सकती है। –