2010-08-26 5 views
3

J'ai un problème inattendu d'appel mis sur une hashtable old-school. Que se passe t-il ici?Utilisation de scala pour appeler 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, la question est toujours debout comme il est, mais j'ai une solution de contournement méchant:

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} 

Répondre

4

Ce properties l'interface semble être l'une de ces API vieille école que les génériques Java avant la date. Les traits de soulignement dans java.util.HashTable[_, _] sont des raccourcis pour les types existentiels, dont le premier (le type de clé) correspond au ?0 apparaissant dans le diagnostic. Ces anciens types «bruts» de Java sont une faille visible et malencontreuse dans l'interopérabilité Java de Scala, même si celle-ci n'apparaît généralement que dans les très anciennes API.

+3

Il est généralement «OK» de les convertir en valeurs AnyRef si nécessaire. Ce serait pratique si toutes ces "mauvaises" méthodes génériques étaient documentées et que le compilateur pourrait avoir une option pour les corriger pour vous. – jsuereth

Questions connexes