我很好奇为什么会出现这样的错误:
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}最初的问题是这里。
这里已经太晚了,无法检查超载情况。
不正确的推测:
它必须在接受int的构造函数和集合之间进行选择。看起来,对于多态方法,具有更特定结果类型的方法更具体。也许,Hashtable<K, V>()比Hashtable<String, Integer>更具体,因为<K,V>可能比<String, Integer>更具体,反之亦然。
不,这不对:
implicitly[Hashtable[String,Integer] <:< Hashtable[_,_]]实际上
public Hashtable(Map<? extends K, ? extends V> t)发布于 2014-02-02 16:57:52
在这张票是用反义词写的。中,当所需构造函数的类型推断失败时,重载解析将解析为使用一个值参数的另一个构造函数。
给予:
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),那么在选择一个时,这个错误就会被吞没。
没有编译器选项可以要求它解释为什么选择特定的重载。
https://stackoverflow.com/questions/21495821
复制相似问题