समारोह संरचनात्मक प्रकार स्वीकार करता है, यह परिभाषित किया जा सकता है:स्कैला संरचनात्मक प्रकार पर कॉल विधि के प्रतिबिंब का उपयोग क्यों करता है?
def doTheThings(duck: { def walk; def quack }) { duck.quack }
या
type DuckType = { def walk; def quack }
def doTheThings(duck: DuckType) { duck.quack }
उसके बाद, आप निम्नलिखित तरीके से कि समारोह का उपयोग कर सकते हैं:
class Dog {
def walk { println("Dog walk") }
def quack { println("Dog quacks") }
}
def main(args: Array[String]) {
doTheThings(new Dog);
}
आप डिकंपाइल हैं (जावा में) मेरे उदाहरण के लिए स्केलैक द्वारा उत्पन्न कक्षाएं, आप देख सकते हैं कि doTheThings
का तर्क Object
और आईएम का प्रकार है plementation तर्क पर कॉल विधियों के प्रतिबिंब का उपयोग करता है (यानी। duck.quack
)
मेरा प्रश्न है कि प्रतिबिंब क्यों? क्या प्रतिबिंब के बजाय अज्ञात और invokevirtual का उपयोग करना संभव नहीं है?
यहाँ अनुवाद करने के लिए (लागू) संरचनात्मक प्रकार कहता है मेरे उदाहरण के लिए तरीका है (जावा वाक्य रचना है, लेकिन बिंदु बाईटकोड है):
class DuckyDogTest {
interface DuckType {
void walk();
void quack();
}
static void doTheThing(DuckType d) {
d.quack();
}
static class Dog {
public void walk() { System.out.println("Dog walk"); }
public void quack() { System.out.println("Dog quack"); }
}
public static void main(String[] args) {
final Dog d = new Dog();
doTheThing(new DuckType() {
public final void walk() { d.walk(); }
public final void quack() { d.quack();}
});
}
}
मुझे अंतिम वाक्य नहीं मिलता है, क्या आप कृपया समझा सकते हैं? –
@ ओम-नाम-नाम 'invokevirtual' JVM 1.5 और 1.6 पर मौजूद नहीं है, इसलिए स्कैला इस पर भरोसा नहीं कर सकता है। स्कैला 2.10 वास्तव में जेवीएम 1.5 को हटा देगा, लेकिन स्कैला केवल जेवीएम 1.7 पर मौजूद चीजों का लाभ उठा सकता है, लेकिन यह अभी भी कुछ समय पहले है। –
@ डैनियल सी सोब्राल: मुझे लगता है कि आपकी पिछली टिप्पणी –