2012-05-22 17 views
5

जावा 6 में मैं का उपयोग कर रहा था जावा 6 में लेकिन जावा 7 में विफल रहता है (त्रुटि प्रतीक नहीं मिल सकती है - क्योंकि संकलक वर्ग ऑब्जेक्ट पर सभी() ढूंढता है)संकलक परिवर्तन 7

List<User> users = getCountrySpecificComponent(uk, us).findAll(); 

यह जावा 7

List<User> users = ((Repository)getCountrySpecificComponent(uk, us)).findAll(); 

में संकलित मैं जानता हूँ कि यह एक नहीं बल्कि असामान्य उपयोग के मामले है, लेकिन इस बदलाव के लिए एक कारण है? या संकलक को थोड़ा "स्मार्ट" होने का बताने का एक तरीका?

+0

'टी' प्रकार का उद्देश्य क्या है? क्या आप उस सामान्य पैरामीटर को खत्म कर सकते हैं और 'यूके' और 'यूएस' का विस्तार 'रिपोजिटरी' कर सकते हैं? मुझे लगता है कि यह समस्या की जड़ है - संकलक यह नहीं जान सकता कि आप जो कुछ भी प्राप्त करते हैं उसे प्राप्त करें 'getCountrySpecificComponent() 'एक' रिपोजिटरी 'है जब तक आप इसे नहीं बताते। –

+0

अच्छा सवाल! मैं इसे सभी प्रकार की रिपॉजिटरीज, सेवाओं और अन्य सामानों के लिए उपयोग करना चाहता हूं जो देश विशिष्ट हैं। मैं इसे और अधिक सामान्य/उपयोग करने योग्य बनाने की कोशिश कर रहा हूं। – skytteren

+0

मुझे नहीं लगता कि यह जावा 6 में भी संकलित कैसे हो सकता है जब तक कि कुछ खतरनाक धारणा नहीं की जाती ... क्यों 'टी' 'रिपोजिटरी 'क्यों होनी चाहिए, जब यह मामला आसानी से' ऑब्जेक्ट 'हो सकता है? – mellamokb

उत्तर

3

मुझे लगता है कि TRepository का विस्तार करने के लिए बाध्य होना चाहिए। इस तरह संकलक जानता है कि getCountrySpecificComponent कुछ भंडार देता है।

संपादित करें:

यह भी लिखने के लिए ठीक होना चाहिए: public static <T extends Repository> T getCountrySpecificComponent(T uk, T us)

0

तब मैं इस बात से सहमत है कि यह एक गलती थी वर्ष संकलक कि स्वीकार करने के लिए। मुझे लगता है कि आप कुछ इस तरह हैं:

public interface UserFindingComponent{ 
    List<User> findAll(); 
} 

public interface Repository extends UserFindingComponent{ } 

public interface RepositoryUS extends Repository{} 

public interface RepositoryUK extends Repository{} 

...

public static <T extends UserFindingComponent, UK extends T, US extends T> T getCountrySpecificComponent(UK uk, US us) { 
    Country country = CountryContext.getCountry(); 
    if (country == Country.US) { 
     return us; 
    } else if (country == Country.UK) { 
     return uk; 
    } else { 
     throw new IllegalStateException("Unhandled country returned: "+country); 
    } 
} 
0

इस मामले में संकलक प्रकार पैरामीटर, जो शायद जावा 6 में मामले के रूप में अच्छी तरह से किया जाना चाहिए था अनुमान कर करने में असमर्थ था । आप कंपाइलर को बता सकते हैं कि जेनेरिक प्रकार क्या हैं, नीचे दिए गए वाक्यविन्यास का उपयोग करते हुए:

import java.util.List; 

class User { 
} 

interface Repository { 
    List<User> findAll(); 
} 

interface RepositoryUS extends Repository { 
} 

interface RepositoryUK extends Repository { 
} 

class Test { 
    public static <T, UK extends T, US extends T> T getCountrySpecificComponent(UK uk, US us) { 
    Country country = CountryContext.getCountry(); 
    if (country == Country.US) { 
     return us; 
    } else if (country == Country.UK) { 
     return uk; 
    } else { 
     throw new IllegalStateException("Unhandled country returned: " + country); 
    } 
    return us; 
    } 

    public static void main(String... args) { 
    RepositoryUK uk = null; 
    RepositoryUS us = null; 
    List<User> users = Test.<Repository, RepositoryUK, RepositoryUS>getCountrySpecificComponent(uk, us).findAll(); 
    } 
}