जेपीए पूरी तरह से क्योंकि सार श्रेणी स्तर पर और अपने ठोस वर्ग के लिए सामान्य दिखाई देता है यह वास्तव में है अपने प्रस्तावित संभाल करने में सक्षम है:
इन पर विचार करें प्रति वर्ग एक मूल्य। वास्तव में, जेपीए आपके उप-वर्गों को एक या अधिक तालिका में संग्रहीत करेगा, आपके द्वारा चुने गए @InheritanceStrategy के अनुसार और इसके लिए विभिन्न तंत्र का उपयोग करता है।
आप बाहर अपने आप को समझ सकते हैं कि आपका मामला एक समस्या नहीं है, कैसे एक ORM एक डीबी पर दो वर्गों को बचा सकता है के बारे में तर्क:
- आप एक ही तालिका में MyStringClass और MyIntegerClass स्टोर कर सकते हैं, एक को जोड़ने भेदभाव कॉलम ताकि ओआरएम, जब यह डीबी से लोड हो, पता है कि किस कन्स्ट्रक्टर को बुलाया जाना चाहिए।
- आप प्रत्येक सबक्लास को अधिक तालिका में स्टोर कर सकते हैं।
क्या संभव नहीं है, दूसरी तरफ, परिभाषित करने के लिए एक सामान्य
@Entity
@Table(name = "MyGenericClass")
public class MyGenericClass<T> {
private T t;
public MyGenericClass(T t) {
this.t=t;
}
}
इस का कारण यह है कि, संकलन समय पर, टी प्रकार विलोपन की वजह से "मिट" जाता है। इसका उपयोग हस्ताक्षर और प्रकार की शुद्धता को सत्यापित करने के लिए संकलित समय पर किया जाता है, लेकिन फिर इसे java.lang.Jbject में जेवीएम के अंदर बदल दिया जाता है। आप अब तक का पालन करें, तो आप को समझने के लिए निम्नलिखित सक्षम होना चाहिए:
- आपके मामले में, AbstractMyClass के हर ठोस उपवर्ग एक प्रकार टी जो वर्ग के सभी उदाहरणों के लिए परिभाषित किया गया है है। जबकि टी सूचना को सार MyClass में नहीं रखा गया है, यह उपclasses के अंदर बनाए रखा और अद्वितीय है।
- दूसरे मामले में मैंने पोस्ट किया है, MyGenericClass के प्रत्येक संभावित ठोस उदाहरण के लिए टी के लिए एक संभावित अलग-अलग मूल्य हो सकता है, और टाइप एरर के कारण यह जानकारी बरकरार नहीं है।
* नोट: तथ्य यह है कि जेपीए द्वारा दूसरे मामले को संभाला नहीं जा सकता है, यह तथ्य बिल्कुल उचित है और यदि आप उस मामले में पड़ते हैं तो आपको अपने डिजाइन के बारे में प्रश्न पूछना चाहिए। जेनेरिक लचीली कक्षाओं को डिजाइन करने के लिए एक शानदार उपकरण है जो अन्य वर्गों को एक प्रकार से सुरक्षित तरीके से संभाल सकता है, लेकिन टाइप-सेफ एक प्रोग्रामिंग भाषा अवधारणा है जिसका निरंतरता से कोई लेना-देना नहीं है।
अतिरिक्त: आप वास्तव में मिटाने के लिए जावाप का उपयोग कर सकते हैं। MyGenericClass से एनोटेशन लें और इसे संकलित करें।
G:\>javac MyGenericClass.java
G:\>javap -p MyGenericClass
Compiled from "MyGenericClass.java"
public class MyGenericClass extends java.lang.Object{
private java.lang.Object t;
public MyGenericClass(java.lang.Object);
}
आप किस कार्यान्वयन का उपयोग करते हैं? – JMelnik
डेटाबेस के रूप में ओरेकल 10 जी के साथ 3.6 हाइबरनेट। इसके अलावा, मैं हाथ से मैन्युअल रूप से टेबल उत्पन्न करता हूं। – jaakko
आप डिज़ाइन स्तर पर क्या हासिल करने की कोशिश कर रहे हैं? ऐसे सुपरक्लास होने का क्या मतलब है? –