首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hashtable(int)比Hashtable(Map)更具体

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

Stack Overflow用户
提问于 2014-02-01 08:23:02
回答 1查看 437关注 0票数 4

我很好奇为什么会出现这样的错误:

代码语言:javascript
复制
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>更具体,反之亦然。

不,这不对:

代码语言:javascript
复制
implicitly[Hashtable[String,Integer] <:< Hashtable[_,_]]

实际上

代码语言:javascript
复制
public Hashtable(Map<? extends K, ? extends V> t)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-02 16:57:52

这张票是用反义词写的。中,当所需构造函数的类型推断失败时,重载解析将解析为使用一个值参数的另一个构造函数。

给予:

代码语言:javascript
复制
package rawj;

public class C<K, V> {
    public C(C<? extends K, ? extends V> other) { }
}

然后类型推断失败变得可见:

代码语言:javascript
复制
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),那么在选择一个时,这个错误就会被吞没。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21495821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档