2011-05-29 18 views
8

से जावा कोड बुला जब मैं स्केला आरईपीएल कंसोल में कोड निम्नलिखित निष्पादित करें:NoSuchMethodError जब स्केला

java.util.Collections.max(new java.util.ArrayList[String]()) 

NoSuchMethodError अपवाद फेंक दिया जाता है:

java.lang.NoSuchMethodError: java.util.Collections.max(Ljava/util/Collection;)Lj 
ava/lang/Comparable; 
     at .<init>(<console>:8) 
     at .<clinit>(<console>) 
     at .<init>(<console>:11) 
     at .<clinit>(<console>) 
     at $export(<console>) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. 
java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces 
sorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:592) 

     at scala.tools.nsc.interpreter.IMain$Request$$anonfun$10.apply(IMain.sca 
la:828) 
     at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:4 
3) 
     at scala.tools.nsc.io.package$$anon$2.run(package.scala:31) 
     at java.lang.Thread.run(Thread.java:662) 

स्काला 2.9.0.1, जावा 1.6.0_25

क्यों एक अपवाद फेंक दिया गया है? जावा से निष्पादित एक ही कोड अपेक्षित व्यवहार करता है (NoSuchElementException फेंकता है)।

उत्तर

5

यह एक कंपाइलर बग है जो स्कैला 2.8 और 2.9 दोनों को प्रभावित कर रहा है, जहां संकलक उचित मिटाए गए विधि हस्ताक्षर की गणना नहीं करता है। मुझे एक बग रिपोर्ट से अवगत नहीं है। विधि

संकलन:

public void main(java.lang.String[]); 
    Code: 
    Stack=2, Locals=3, Args_size=2 
    0: new #16; //class java/util/ArrayList 
    3: dup 
    4: invokespecial #18; //Method java/util/ArrayList."<init>":()V 
    7: astore_2 
    8: aload_2 
    9: invokestatic #24; //Method java/util/Collections.max:(Ljava/util/Collection;)Ljava/lang/Comparable; 
    12: pop 
    13: return 

दें कि बाईटकोड ध्यान दें पर ऑफसेट 9 invokes एक Comparable वापसी प्रकार के साथ एक स्थिर विधि, जबकि वास्तविक Collections.max है:

निम्नलिखित बाईटकोड में
object Test { def main(a: Array[String]) { 
    val a = new java.util.ArrayList[String]() 
    java.util.Collections.max(a) 
}} 

परिणाम Object रिटर्न प्रकार के रूप में:

$ javap -p java.util.Collections | grep max 
    public static java.lang.Object max(java.util.Collection); 
+0

उत्सुक। जावाडोक कहते हैं '<टी ऑब्जेक्ट और तुलनात्मक > टी' बढ़ाता है। –

+0

@ डैनियल, जेवीएम विधि के अवांछित प्रकार को देखता है; इसलिए 'ऑब्जेक्ट' को 'ऑब्जेक्ट' में मिटा दिया गया है, लेकिन स्केलेक को उम्मीद है कि इसे 'तुलनात्मक' में मिटा दिया जाएगा। अधिक जानकारी के लिए आप मेरी [ईमेल स्केल-उपयोगकर्ता मेलिंग सूची में ईमेल] की समीक्षा कर सकते हैं (http://groups.google.com/group/scala-user/browse_thread/thread/53498367ee8a856b)। – notnoop

संबंधित मुद्दे