【问题标题】:Hashtable(int) more specific than Hashtable(Map)Hashtable(int) 比 Hashtable(Map) 更具体
【发布时间】:2014-02-01 08:23:02
【问题描述】:

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

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&lt;K, V&gt;()Hashtable&lt;String, Integer&gt; 更具体,因为 &lt;K,V&gt; 可能比 &lt;String, Integer&gt; 更具体,但反之亦然。

不,这是不对的:

implicitly[Hashtable[String,Integer] <:< Hashtable[_,_]]

ctor其实是

public Hashtable(Map<? extends K, ? extends V> t)

【问题讨论】:

  • 不知道为什么它想不通,但是可以告诉它怎么做:new java.util.Hashtable[String,Int](Map("one" -&gt; 1).asJava)为我跑。
  • 也可以val hm: java.util.Map[String,Int] = ...
  • 看起来像是多态 Java 类、重载等问题。尝试最小化一个示例以与j.u.HashMap 隔离。
  • 正如我之前所说,如果 @retronym 正在帮助解决 SO,那么一些非常重要的工作就没有完成。除非这在道德上等同于 Retronym 的水冷却器。我会尽量减少和弥补时间的浪费。

标签: scala


【解决方案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),那么这个错误会在它选择一个时被吞没。

没有编译器选项要求它解释选择特定重载的原因。

【讨论】:

  • 有点蹩脚,在我接受这个答案之前有一个冷静期。为什么 SO 甚至显示带有翻转的复选标记告诉我点击它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多