2011-09-12 10 views
9

मैंने कुछ समय बिताया कि क्या एक गुइस मॉड्यूल लिखना संभव है, जो स्वयं टाइप टी के साथ पैरामीट्रिज्ड है और का उपयोग बाइंडिंग निर्दिष्ट करने के लिए इसके प्रकार पैरामीटर का उपयोग करता है।टाइप पैरामीटर के साथ गिस मॉड्यूल

इस (काम नहीं कर रहा) उदाहरण की तरह:

interface A<T> {} 
class AImpl<T> implements A<T>{} 
interface B<T> {} 
class BImpl<T> implements B<T> {} 

class MyModule<T> extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(new TypeLiteral<A<T>>(){}).to(new TypeLiteral<AImpl<T>>(){}); 
     bind(new TypeLiteral<B<T>>(){}).to(new TypeLiteral<BImpl<T>>(){}); 
    } 
} 

मैं अलग दृष्टिकोण टी कक्षा/TypeLiteral के उदाहरण के रूप में MyModule को पारित करने की कोशिश कर गुजर कोशिश की, लेकिन उनमें से कोई भी काम किया। सहायता की सराहना की।

सादर, Łukasz Osipiuk

उत्तर

12

कि यदि आप बिलकुल प्रत्येक TypeLiteral का निर्माण करने के com.google.inject.util.Types का उपयोग कर जाएगा। आप ऐसा ही कुछ कर सकता है:

class MyModule<T> extends AbstractModule { 
    public MyModule(TypeLiteral<T> type) { 
     _type = type; 
    } 

    @Override protected void configure() { 
     TypeLiteral<A<T>> a = newGenericType(A.class); 
     TypeLiteral<AImpl<T>> aimpl = newGenericType(AImpl.class); 
     bind(a).to(aimpl); 
     TypeLiteral<B<T>> b = newGenericType(B.class); 
     TypeLiteral<BImpl<T>> bimpl = newGenericType(BImpl.class); 
     bind(b).to(bimpl); 
    } 

    @SuppressWarnings("unchecked") 
    private <V> TypeLiteral<V> newGenericType(Class<?> base) { 
     Type newType = Types.newParameterizedType(base, _type.getType()); 
     return (TypeLiteral<V>) TypeLiteral.get(newType); 
    } 

    final private TypeLiteral<T> _type; 
} 

कृपया ध्यान दें कि निजी विधि newGenericType() प्रकार पर कोई नियंत्रण नहीं है प्रदर्शन करेंगे, यह आपकी जिम्मेदारी, configure() में है, यह सुनिश्चित करें कि सामान्य प्रकार के सही ढंग से उस के साथ बनाया जा सकता है बनाने के लिए तरीका।

+0

धन्यवाद एक बहुत - एक आकर्षण की तरह काम करता :) – losipiuk

+0

आपका स्वागत है, मुझे खुशी है कि मैं मदद कर सकता है कर रहा हूँ। मुझे लगता है मैं पहले से ही मेरे हिम्मत घटना पुस्तकालय में उन्नत सामान इस तरह का प्रयोग किया जाता था पता था, तो यह आपके उदाहरण अनुकूल करने के लिए से मैं अतीत में किया था बहुत मुश्किल नहीं था। – jfpoilpret

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