2011-10-15 12 views
6

प्रसंग: जावा का उपयोग कर guice (पिछले संस्करण)TypeLiteral इंजेक्शन

हाय सब लोग, यह इस तरह से Guice के साथ कुछ TypeLiteral इंजेक्षन करना संभव है:

public MyClass<?,?> getMyClass(Injector injector, Class<?> a, Class<?> b) 
{ 
    //how to Inject MyClass with type a & b ? 
    //e.g : injector.getInstance(MyClass<"a class","b class">) 
} 

public interface MyClass<S,T> 
{ 
    public T do(S s); 
} 

public class ClassOne implements MyClass<String,Integer> 
{ 
    public Integer do(String s) 
    { 
      //do something 
    } 
} 

Module : 
bind.(new TypeLiteral<MyClass<String,Integer>(){}).to(ClassOne.class); 
bind.(new TypeLiteral<MyClass<String,Double>(){}).to(ClassTwo.class); 
... 

क्या है इस समस्या को संभालने का सबसे अच्छा तरीका (गुइस के साथ)?

धन्यवाद!

+1

की डुप्लिकेट ysdx

उत्तर

3

अपने प्रकार के लिए एक ParameterizeType बनाएँ:

// It's supposed to be internal. 
// You could use sun.reflect.generics.reflectiveObjects but it is not portable. 
// Or you can implement it yourself (see below) 
ParameterizedType type = new com.google.inject.internal.MoreTypes.ParameterizedTypeImpl(null, MyClass.class, a, b); 

इसमें से एक TypeLiteral बनाएँ:

TypeLiteral typeLiteral = TypeLiteral.get(type); 

अब इंजेक्शन उदाहरण बनाने के लिए:

return (MyClass<A,B>) injector.getInstance(Key.get(typeLiteral)) 

अभ्यास में आप लागू करना चाहते हैं पैरामीटरेट टाइप करें:

final Type[] types = {a, b}; 
ParameterizedType type = ParameterizedType() { 
    @Override 
    public Type[] getActualTypeArguments() { 
    return types; 
    } 

    @Override 
    public Type getOwnerType() { 
    return null; 
    } 

    @Override 
    public Type getRawType() { 
    return MyClass.class; 
    }; 
} 

संपादित करें: वास्तव में, आप उपयोग कर सकते हैं:

Types.newParameterizedType(MyClass.class,a,b) 

देख Guice module with type parameters

+0

ग्रेट वर्क मैन, यह काम करता है! धन्यवाद ! – overflow

0

वास्तव में, मुझे लगता है कि यह संभव नहीं है। जेनेरिक रन-टाइम पर को संशोधित नहीं किया गया है। इसका मतलब है कि जानकारी रन-टाइम पर मौजूद नहीं है। इसलिए यह परवाह नहीं करता कि आप इसे किस सामान्य प्रकार देते हैं।

तो, मुझे लगता है कि इस विधि की आवश्यकता नहीं है। सीधे शब्दों में कुछ इस तरह:

public MyClass<?,?> getMyClass(Injector injector, Class<?> a, Class<?> b) 
{ 
    return new MyClass(); 
    // Or maybe something like this, if you use custom constructors 
    // return injector.getInstance(); 
} 

MyClass के बाद से एक अंतरफलक है, क्या हासिल करना चाहते हैं पूरी तरह से बेकार और असंभव है। जब आप केवल पैरा प्रकार और रिटर्न प्रकार निर्दिष्ट करते हैं तो आप एक विशिष्ट व्यवहार के साथ ऑब्जेक्ट को तुरंत चालू करना चाहते हैं।
मुझे लगता है कि आपको काम करने का एक अलग तरीका खोजने का प्रयास करना चाहिए।

+0

मैंने अपने प्रश्न के लिए और विवरण जोड़ा, धन्यवाद – overflow

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