我很好奇为什么会发生错误:
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/