2012-11-12 6 views
6

に私が実装(ラップ)java.util.Listに、つまりScalaのクラス書いている:委任java.util.Listに#のtoArray(T [] a)は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 

コンパイラはbacki上のtoArrayへの呼び出しと文句を言いngListはArray[? with java.lang.Object]を想定しています。

私はArray[_ >: T with Object](コンパイラが親切に示唆している)のようなものに対して可能なすべてのバリエーションを試したと思いますが、運はありません。助言がありますか?

+1

ないあなたの質問への答えを、しかし、あなたは、このようなラッパーが既に 'JavaConversions' /' JavaConverters'に存在して知っていますか? +1 BTW。 –

+1

私は知っていますが、これはJavaFXの 'ObservableList'(java.util.Listを継承しています)の文脈の中にあります。 –

答えて

3

また、これは動作します:

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

そうです。 'backingList toArray [T](a)'(つまりドットなし)は動作しませんが、おそらくそれはScalaの構文です。 –

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 
+0

私はそれが 'List.toArray'メソッドをオーバーライドするとは思わない。 –

+0

私はそうは思わない、少なくとも質問はそれを言っていない。質問をもう一度読むと、それはそのように解釈されるかもしれません。 :D –

+0

はい、それは 'List.toArray'を実装することになっています。 –