scala – Hashtable(int)比Hashtable(Map)更具体
发布时间:2020-12-16 08:43:33 所属栏目:安全 来源:网络整理
导读:我很好奇为什么会发生错误: scala import collection.JavaConverters._import collection.JavaConverters._scala val m = Map("one"-1)m: scala.collection.immutable.Map[String,Int] = Map(one - 1)scala val jm = m.asJavajm: java.util.Map[String,Int]
我很好奇为什么会发生错误:
scala> import collection.JavaConverters._ import collection.JavaConverters._ scala> val m = Map("one"->1) m: scala.collection.immutable.Map[String,Int] = Map(one -> 1) scala> val jm = m.asJava jm: java.util.Map[String,Int] = {one=1} scala> val hm = new java.util.Hashtable(jm) <console>:12: error: type mismatch; found : java.util.Map[String,Int] required: Int val hm = new java.util.Hashtable(jm) ^ scala> import java.util._ import java.util._ scala> val hm: Dictionary[String,Int] = new java.util.Hashtable(jm) hm: java.util.Dictionary[String,Int] = {one=1} 最初的问题是here. 在这里检查超载已经太晚了. 推测不正确: 它必须在采用int或集合的构造函数之间进行选择.看起来,对于多态方法,具有更具体结果类型的方法更具体.也许,Hashtable< K,V>()比Hashtable< String,Integer>更具体.因为可能有< K,V>比< String,Integer>更具体但反之亦然. 不,那不对: implicitly[Hashtable[String,Integer] <:< Hashtable[_,_]] 实际上是ctor public Hashtable(Map<? extends K,? extends V> t) 解决方法
从
the ticket written up by retronym开始,当所需构造函数的类型推断失败时,重载决策将解析为使用带有一个值参数的其他构造函数.
鉴于: package rawj; public class C<K,V> { public C(C<? extends K,? extends V> other) { } } 然后类型推断失败变得可见: scala> new rawj.C(null) <console>:8: error: inferred type arguments [?1,?0] do not conform to class C's type parameter bounds [K,V] new rawj.C(null) ^ scala> val c: rawj.C[Int,Int] = new rawj.C(null) // supply type args c: rawj.C[Int,Int] = rawj.C@483d5954 如果C的另一个构造函数具有相同的形状(采用一个arg),则在选择一个时会吞下此错误. 没有编译器选项要求它解释为什么选择了特定的重载. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |