2010-08-26 42 views
3

我有一個意想不到的麻煩調用放在舊學校哈希表。這裏發生了什麼?使用scala調用java.util.Hashtable#put

Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_21). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import com.ibm.mq._     
import com.ibm.mq._ 

scala> MQEnvironment.properties              
res1: java.util.Hashtable[_, _] = {} 

scala> res1.put("transport", "MQSeries") 
<console>:10: error: type mismatch; 
found : java.lang.String("transport") 
required: ?0 where type ?0 
     res1.put("transport", "MQSeries") 
      ^

PS,問題仍然有效的是,但我有一個討厭的解決辦法:

scala> new java.util.Hashtable[String, String] 
res10: java.util.Hashtable[String,String] = {} 

scala> res10.put("transport", "MQSeries")  
res11: String = null 

scala> MQEnvironment.properties = res10 

scala> MQEnvironment.properties   
res13: java.util.Hashtable[_, _] = {transport=MQSeries} 

回答

4

properties界面似乎是那些老派的API,日期早於Java泛型之一。 java.util.HashTable[_, _]中的下劃線是存在類型的簡寫,其中第一個(關鍵類型)對應於出現在診斷中的?0。這些舊的Java「原始」類型在Scala的Java互操作性中是一個不幸的,可見的縫隙,儘管它通常只在非常老的API中才出現。

+3

根據需要將它們轉換爲AnyRef值通常是「OK」。如果所有這些「不好」的通用方法都被記錄下來,並且編譯器可以選擇爲您更正這些方法,那將很方便。 – jsuereth 2010-08-27 01:28:38