gpt4 book ai didi

scala - Hashtable(int) 比 Hashtable(Map) 更具体

转载 作者:行者123 更新时间:2023-12-01 05:14:58 26 4
gpt4 key购买 nike

我很好奇为什么会发生错误:

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

没有编译器选项要求它解释选择特定重载的原因。

关于scala - Hashtable(int) 比 Hashtable(Map) 更具体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21495821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com