我正在编写一个实现(包装)java.util.List的Scala类,即:
class MyList(backingList: java.util.List) extends java.util.List
后者有一个带有Java签名的方法,如下所示:
<T> T[] toArray(T[] a)
天真地,我把它写成:
def toArray[T](a: Array[T]) = backingList toArray a
但是编译器抱怨在backingList上调用toArray需要Array[? with java.lang.Object]
。
我想我已经尝试了Array[_ >: T with Object]
(编译器友好建议的)之类的所有可能的变体,但没有运气。有什么建议吗?
答案 0 :(得分:3)
这也有效:
def toArray[T](a: Array[T with Object]) = backingList.toArray[T](a)
答案 1 :(得分:2)
Array[_ >: T with Object]
是Array[X forSome {type X <: Object}]
的语法糖,意思是一个对象数组,其类型是Object的子类型,但你需要的是一个相同类型X的对象数组,它是一个子类型对象。简而言之,这只是一个范围问题。
def toarray(a: Array[X] forSome {type X <: Object}) = backingList toArray a