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

标签 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)

最佳答案

来自 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/

相关文章:

scala - akka http配置中的空闲超时和请求超时有什么区别?

string - 连接填充字符串

scala - 具有外部数据库和 RESTful Web gui 和服务的系统的正确设计是什么?

scala - 为什么隐式搜索会受到不相关类型参数的影响?

scala - 字符串被视为序列

scala - 简化方法: Merge two Options to one result

c# - 您将如何使用 Scala 的异步使多个异步请求超时?

scala - 如果我有一个 Actor 应该有很大的吞吐量怎么办?

json - 如何将scala数组写入json文件?

scala - 当我用 sbt 运行 Play Framework 示例时出现一些错误