加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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),则在选择一个时会吞下此错误.

没有编译器选项要求它解释为什么选择了特定的重载.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读