तो यह स्केला को this Java question के एक काफी सीधा बंदरगाह हैस्काला में अनावश्यक सामान्य मानकों से बचना
इस प्रकार हम लक्षण है कि जेनेरिक पैरामीटर पर ध्यान का एक समूह है:
trait Ident { }
trait Container[I <: Ident] {
def foo(id: I): String
}
trait Entity[C <: Container[I], I <: Ident] {
def container: C
def foo(id: I) = container.foo(id)
}
यह काम करता है, लेकिन यह एक छोटे से है clumbsy, क्योंकि हम अध्यक्ष के प्रकार और कंटेनर के प्रकार जब इकाई की एक उप-वर्ग को परिभाषित प्रदान करने के लिए है। वास्तव में सिर्फ कंटेनर के प्रकार अपने आप में पर्याप्त प्रकार की जानकारी होगी जब:
class MyIdent extends Ident { }
class MyContainer extends Container[MyIdent] { }
class MyEntity extends Entity[MyContainer,MyIdent] { }
// ^^^^^^^ shouldn't really be necessary
एक अस्तित्व प्रकार का उपयोग करते हुए इकाई दो पैरामीटर लेने के लिए के लिए की जरूरत से बचा जाता है ... लेकिन निश्चित रूप से आप इसे का उल्लेख नहीं कर सकते बाद में।
trait Entity[C <: Container[I] forSome { type I <: Ident }] {
def container: C
def foo(id: I) = container.foo(id)
// ^^^ complains it has no idea what 'I' is here
}
इसी सदस्य प्रकार भी काम नहीं करता है का उपयोग करने के बात परिवर्तित ... हो, तो स्काला में इस समस्या का एक सुरुचिपूर्ण समाधान
trait Ident { }
trait Container {
type I <: Ident
def foo(id: I): String
}
trait Entity {
type C <: Container
def container: C
def foo(id: C#I) = container.foo(id)
// ^^ type mismatch
}
तो किसी को पता है?
मुझे नहीं लगता कि उत्तर जावा संस्करण से बहुत अलग होगा। प्रकार के पैरामीटर को खोने के बिना वास्तव में टाइप पैरामीटर को छोड़ने का कोई तरीका नहीं है जो इसके साथ आएगा। –
क्या यह 'कंटेनर' को 'वैल' बनाने का विकल्प है? – sepp2k
@MichaelZajac "MyEntity" दूसरी इकाई के लिए प्रदान की पैरामीटर की परिभाषा में तो बेमानी है: वहाँ बस कोई अन्य संभव प्रकार तुम वहाँ "MyIdent" के अलावा अन्य इस्तेमाल कर सकते हैं, काफी का शाब्दिक कुछ और संकलन त्रुटियों दे देंगे। बेशक, आप स्काला में है कि अतिरेक से बच सकते हैं कि क्या मैं कैसे क्या मेरा उत्तर में प्रस्तावित की तरह कुछ नेतृत्व कर सकते हैं के लिए एक और सवाल :-) –