Xtend 猫王?:运算符未按预期工作



我正在使用Xtend编写一个Android应用程序,并且我想使用elvis操作符来简化以下内容(它可以工作):

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

通过使用猫王运算符,我写:

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

您遇到了类型推断的限制。猫王操作符的定义如下:

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

最新更新