मुझे यकीन नहीं है कि आप जावा में एक अमूर्त स्थैतिक विधि के साथ क्या करना चाहते हैं, लेकिन अतीत में वर्णित एकमात्र संभावित उपयोग केस मैंने देखा है (मेरी इच्छा है कि मैं किसके द्वारा याद करता हूं ...) कॉल कर रहा है एक सामान्य प्रकार पैरामीटर पर सीधे एक विधि।
अर्थात जावा कुछ इस तरह ...
// this is not valid java...
// let's pretend we can define a static method in an interface
interface Foo {
static String Foo();
}
// a class that implements our interface
class FooImpl implements Foo {
public static String Foo() {return "foo";}
}
अनुमति अगर ...हम एक सामान्य पैरामीटर पर इसका इस्तेमाल कर सकता है,) सीधे प्रकार पर फू (कॉल करने के लिए
static <T extends Foo> String Test() {
return T.Foo(); // even if our hypothetical static interface
// was a valid thing, this would probably still fail
// due to type erasure
}
यह सी # में कुछ और अधिक समझ बनाने होता है क्योंकि:
- reified जेनरिक मतलब टाइप मिट नहीं प्राप्त करता है
- सी # ऑपरेटरों में स्थिर तरीके हैं और आप define your own operators
मूल रूप से यह एक "नाटक सी #" स्थिर इंटरफेस के साथ, आप somethi इस्तेमाल कर सकते हैं में इसका मतलब कर सकते हैं एनजी "उपरोक्त जावा" कोड से संबंधित एक जेनेरिक विधि लिखने के लिए जो किसी भी प्रकार पर काम करता है जो एक विशिष्ट ऑपरेटर को परिभाषित करता है (उदा। सबकुछ जिसमें "+" ऑपरेटर है)।
अब, स्कैला पर वापस जाएं। स्कैला इस परिदृश्य को कैसे संबोधित करता है? भाग में यह नहीं है। स्कैला में कोई स्थैतिक तरीका नहीं है: ऑब्जेक्ट एक सिंगलटन (यानी केवल एक उदाहरण वाला वर्ग है) लेकिन फिर भी सामान्य, उदाहरण विधियों वाला एक वर्ग, यानी ऑब्जेक्ट्स पर आप अभी भी एकमात्र उदाहरण पर विधियों को कॉल कर रहे हैं, सीधे प्रकार पर नहीं (यहां तक कि ऑपरेटर स्केल में विधियां हैं)।
तो स्केला में हम लिखते थे:
trait Foo { def Foo:String }
object FooImpl extends Foo { def Foo = "foo" }
def Test(f: Foo) = f.Foo
... और
scala> Test(FooImpl)
res0: String = foo
// note that FooImpl is still an instance (the only one) of FooImpl and not
// the type itself
के साथ हमारे विधि कॉल आप implicits एक पैरामीटर के रूप केवल उदाहरण गुजर से बचने के लिए के साथ कुछ चाल कर सकते हैं:
implicit def aFoo = FooImpl
def Test2(implicit f: Foo) = f.Foo
अब यह काम करता है:
+०१२३५१६४१०६१
scala> Test2
res1: String = foo
implicits के साथ अधिक उन्नत चाल के साथ, स्कैला भी संख्यात्मक परिभाषित करता है, allows you to use operators on any numeric value, भले ही वे बॉक्स के बाहर एक सामान्य इंटरफ़ेस लागू नहीं करते हैं।
क्या आप हमें अपने विशिष्ट परिदृश्य के बारे में कुछ और बता सकते हैं? साथी वस्तु में होने की विधि की आपको आवश्यकता क्यों है? स्कैला में ऐसा करने का एक अलग तरीका हो सकता है। –
यहां एक उदाहरण दिया गया है: मेरा मूल सार वर्ग में एक सारणी स्वत: सुधार विधि है, इसे किसी विशिष्ट उदाहरण से बाध्य होने की आवश्यकता नहीं है। मैं मूल सार वर्ग में कार्यान्वयन विधियों पर विचार कर रहा हूं जो इस स्वत: सुधार विधि का उपयोग करेंगे। यदि कार्यक्षमता को बाल कक्षाओं में ओवरराइड करने की आवश्यकता नहीं है, तो मेरे बच्चे वर्गों को अपनी स्वयं की स्वत: सही विधि लागू करने की आवश्यकता होगी - इसलिए अमूर्त स्थैतिक तरीकों। –
यदि आप जो कुछ भी कर रहे हैं वह एक विधि को कॉल कर रहा है जो एक विशिष्ट उदाहरण से बंधे नहीं है, तो विधि को वस्तु ऑब्जेक्ट में रखें, और इसे अपनी कक्षा और सभी उप-वर्गों से कॉल करें। स्कैला में ऐसा करने का सामान्य तरीका होगा। –