Scala映射值扩展了接口

时间:2017-11-30 20:06:42

标签: java scala

此方法位于我们调用的Java库中

   public void setNumbers(Map<Integer, ? extends COSObjectable> numbers) {
...
    }

我有一个混合的Java / Scala项目,我将工作代码从Java类转移到Scala类中,现在我无法通过Scala使用此调用。我能得到的最好的是

  val numbers = new util.HashMap[Integer, _ <: COSObjectable ]
  node.setNumbers(numbers)

无法使用

进行编译

需要类类型但找不到java.util.HashMap [Integer,_&lt;:org.apache.pdfbox.pdmodel.common.COSObjectable]

地图的COSObjectable参数是java接口

public interface COSObjectable {
    COSBase getCOSObject();
}

我不确定Scala在使用界面时是否喜欢这种语法。似乎在说我只能在课堂上这样做。

3 个答案:

答案 0 :(得分:1)

我想也许我只是在努力,取消_&lt;:似乎工作

val numbers = new util.HashMap[Integer, COSObjectable ]

答案 1 :(得分:0)

我能够使用它:

object Tes {
  case class RandomStuff()
  val numbers = new java.util.HashMap[Integer, _ <: RandomStuff ]
}

  trait COSObjectable {
    def getCOSObject: Nothing
  }

  val numbers: Map[Integer, _ <: COSObjectable ] = Map.empty

答案 2 :(得分:0)

实例化类时,需要使用特定类型,而不是通配符。就像在Java中一样,你无法做new util.HashMap<Integer, ? extends COSObjectable>,你可以做同等的new util.HashMap[Integer, _ <: COSObjectable]

您需要指定实际类型,例如new util.HashMap[Integer, COSObjectable](或您需要的COSObjectable的任何子类型)。