代码之家  ›  专栏  ›  技术社区  ›  Synesso

使用scala调用java.util.Hashtable#put

  •  3
  • Synesso  · 技术社区  · 14 年前

    我打电话给一个老式的哈希表时遇到了一个意想不到的麻烦。这是怎么回事?

    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")
                ^
    

    问题依然存在,但我有一个棘手的解决办法:

    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}
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Randall Schulz    14 年前

    那个 properties 接口似乎是那些早于Java泛型的老式api之一。这些下划线 java.util.HashTable[_, _] 是存在类型的缩写,其中第一个(键类型)对应于 ?0 出现在诊断中。这些旧的Java“原始”类型在Scala的Java互操作性中是一个不幸的、可见的接缝,尽管它通常只出现在非常旧的api中。