【问题标题】:Delegate java.util.List#toArray(T[] a) in Scala在 Scala 中委托 java.util.List#toArray(T[] a)
【发布时间】:2012-11-13 04:34:44
【问题描述】:

我正在编写一个实现(包装)java.util.List 的 Scala 类,即:

class MyList(backingList: java.util.List) extends java.util.List

后者有一个带有 Java 签名的 toArray 方法,如下所示:

<T> T[] toArray(T[] a)

天真地,我写成这样:

def toArray[T](a: Array[T]) = backingList toArray a

但编译器抱怨在 backingList 上对 toArray 的调用需要 Array[? with java.lang.Object]

我想我已经尝试了所有可能的变化,比如Array[_ &gt;: T with Object](编译器好心建议),但没有运气。有什么建议吗?

【问题讨论】:

  • 不是您问题的答案,但您知道JavaConversions/JavaConverters 中已经存在这样的包装器? +1 顺便说一句。
  • 我知道,但这是在 JavaFX 的 ObservableList(扩展 java.util.List)的上下文中。

标签: java scala


【解决方案1】:

这也有效:

def toArray[T](a: Array[T with Object]) = backingList.toArray[T](a)

【讨论】:

  • 确实如此。 backingList toArray[T](a)(即没有点)虽然不起作用,但这可能是 Scala 语法的事情。
【解决方案2】:

Array[_ &gt;: T with Object]Array[X forSome {type X &lt;: Object}] 的语法糖,意思是一个对象数组,其类型是Object 的子类型,但您需要的是一个相同类型X 的对象数组,它是Object 的子类型。所以简而言之,这只是一个范围界定问题。

def toarray(a: Array[X] forSome {type X <: Object}) = backingList toArray a

【讨论】:

  • 我认为它不会覆盖List.toArray 方法。
  • 我认为不应该这样做,至少问题没有这么说。再次阅读这个问题,它可能会被这样解释。 :D
  • 是的,它应该实现List.toArray
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 2011-09-26
  • 2014-12-12
  • 2012-01-06
  • 2022-06-17
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多