我很好奇为什么会发生错误:
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)
答案 0 :(得分:1)
从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),则在选择一个时会吞下此错误。
没有编译器选项要求它解释为什么选择了特定的重载。