2013-04-17 25 views
2

我使用的Xtend寫一個Android應用程序操作不工作,我想用Elvis操作符來簡化下面的(工作):的Xtend貓王:如預期

val c = if (projection != null) new MatrixCursor(projection) else new MatrixCursor(#[MediaStore$MediaColumns::DISPLAY_NAME, MediaStore$MediaColumns::SIZE]) 

通過使用elvis算子,我寫道:

val c = new MatrixCursor(projection ?: #[MediaStore$MediaColumns::DISPLAY_NAME, MediaStore$MediaColumns::SIZE]) 

其中,據我所知,工作方式相同。

但是,我在Eclipse中遇到了這個錯誤:Type mismatch: cannot convert from Object to String[]它有什麼問題?

我使用Xtend 2.4,MatrixCursor構造函數簽名是MatrixCursor(String[]),而projection明確定義爲String[]

回答

3

您正在絆倒類型推斷的限制。 Elvis操作符被定義爲沿着這些線的東西:

def <T> T elvis(T original, T placeholder) { 
    .. 
} 

如果爲了將類型變量T結合,二者的操作數類型的計算。由於數組文字#[..]實際上主要是列表文字,因此T的綁定從String[]List<String>而不是兩個String[]計算得出。因此,常見的超類型是Object,所以elvis只是Object。你可以說服類型系統,你希望第二個操作數是一個String[]明確鑄造它:

val c = new MatrixCursor(projection ?: #[DISPLAY_NAME, SIZE] as String[]) 
+0

謝謝!你知道這樣做是否會在未來得到改善,還是通過設計? – yuku

+0

未來我們很可能會改進這一點。它目前是類型推斷的一個限制。 –