2011-05-29 37 views
8

Java代碼時當我執行斯卡拉REPL控制檯下面的代碼:的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

爲什麼在這裏拋出異常? 從Java執行的代碼行爲與預期相同(拋出NoSuchElementException)。

回答

5

這是一個編譯器錯誤,影響Scala 2.8和2.9,其中編譯器不計算正確的刪除方法簽名。我不知道有一個錯誤報告。

編譯方法:

object Test { def main(a: Array[String]) { 
    val a = new java.util.ArrayList[String]() 
    java.util.Collections.max(a) 
}} 

結果分爲以下幾個字節碼:

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調用了一個帶有Comparable返回類型的靜態方法,而實際Collections.maxObject作爲退貨類型:

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

好奇。 Javadoc說'> T'。 – 2011-05-29 22:04:13

+0

@Daniel,JVM看着這個方法的刪除類型;所以'T'被擦除爲'Object',但Scalac希望它被擦除爲'Comparable'。您可以查看我的[scala用戶郵件列表中的電子郵件](http://groups.google.com/group/scala-user/browse_thread/thread/53498367ee8a856b)以獲取更多詳細信息。 – notnoop 2011-05-29 23:31:36