आशा है कि कोई इस भ्रम से मेरी मदद कर सकता है। क्रम में यह सुनिश्चित करें कि कुंजी के रूप में इस्तेमाल वर्ग MyInterface में पैरामीटर के रूप में इस्तेमाल किया वर्ग के रूप में एक ही है बनाने के लिएजावा जेनेरिक पास पैरामीटर
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
प्रयुक्त पैरामीटर टी:
मैं इस विधि बनाया है।
अब मैं एक नक्शा पास करना चाहता हूं जो अलग-अलग वर्गों को चाबियाँ, निश्चित रूप से, और MyInterface के अनुरूप कार्यान्वयन के रूप में अलग करना चाहता है।
लेकिन यह काम नहीं करता है, टाइप पैरामीटर के कारण वाक्यविन्यास त्रुटियां प्राप्त कर रहा है। यहां कोड है, मुझे उम्मीद है कि आत्म व्याख्यात्मक है।
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<Class<?>, MyInterface<?>> map = new HashMap<Class<?>, MyInterface<?>>();
// Map<Class<Object>, MyInterface<Object>> map = new HashMap<Class<Object>, MyInterface<Object>>();
map.put(Object.class, new MyObjectImpl());
//if I use Map<Class<Object>, MyInterface<Object>> I get a compiler error here
//because map<String> is not map<Object> basically
map.put(String.class, new MyStringImpl());
//this would be possible using <?>, which is exactly what I don't want
// map.put(String.class, new MyIntegerImpl());
//<?> generates anyways a compiler error
myMethod(map);
}
//use T to make sure the class used as key is the same as the class of the parameter "object" in doSomething
public static <T> void myMethod(Map<Class<T>, MyInterface<T>> map) {
}
interface MyInterface<T> {
void doSomething(T object);
}
static class MyObjectImpl implements MyInterface<Object> {
@Override
public void doSomething(Object object) {
System.out.println("MyObjectImpl doSomething");
}
}
static class MyStringImpl implements MyInterface<String> {
@Override
public void doSomething(String object) {
System.out.println("MyStringImpl doSomething");
}
}
static class MyIntegerImpl implements MyInterface<Integer> {
@Override
public void doSomething(Integer object) {
System.out.println("MyIntegerImpl doSomething");
}
}
}
कक्षा 'Impl' में समाप्त होने वाले नाम आम तौर पर अधिक इंजीनियरिंग (जैसे इसका अर्थ है के लक्षण हैं (नीचे दिए गए उदाहरण की तरह)
MapConstraints.constrainedMap
उपयोग करने के लिए किया जाएगा , जिसे लागू नहीं किया जा सकता है)। – Romainइसके बारे में भूल जाओ, यह काम नहीं कर सकता है। जेनेरिक केवल एक समरूप मानचित्र परिभाषित कर सकते हैं।आप प्रवेश-दर-प्रविष्टि आधार पर कुछ भी लागू नहीं कर सकते हैं, केवल सभी मानचित्र प्रविष्टियों के लिए एक ही चीज़। –
@ ठीक है, वास्तविक नाम इस तरह नहीं हैं, बस एक स्पष्ट उदाहरण बनाने के लिए लिखा है। लेकिन आपकी टिप्पणी भी लागू हो सकती है। आपका क्या मतलब है कि इसका मतलब केवल 1 कार्यान्वयन है, मेरे पास 3 है? – Ixx