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

时间:2014-02-01 08:23:02

标签: scala

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

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)

1 个答案:

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

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