Xtend Elvis ?:运算符无法按预期工作

时间:2013-04-17 04:39:26

标签: operators xtend

我正在使用Xtend编写Android应用程序,我想使用elvis运算符来简化以下(有效):

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[]

1 个答案:

答案 0 :(得分: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[])